2014-09-04 168 views
2

我有一个列表,其中包含一个整数列表和另一个列表,其中包含一个同时包含整数和字符串的类。基于另一个列表的内容排序列表

我想要做的是按字母顺序对我的列表进行排序,首先将条目存在于第一个列表中。这里是我的代码和预期输出:

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Program 
{ 
    public static void Main() 
    { 
     var myList = new List<int>(); 
     myList.Add(5); 
     myList.Add(15); 

     var myclasses = new List<MyClass>(); 
     myclasses.Add(new MyClass {MyId = 8, MyString = "Entry1"}); 
     myclasses.Add(new MyClass {MyId = 12, MyString = "Entry2"}); 
     myclasses.Add(new MyClass {MyId = 1, MyString = "Entry3"}); 
     myclasses.Add(new MyClass {MyId = 15, MyString = "Entry4"}); 
     myclasses.Add(new MyClass {MyId = 9, MyString = "Entry5"}); 
     myclasses.Add(new MyClass {MyId = 5, MyString = "Entry6"}); 

     foreach (MyClass c in myclasses.OrderBy(z => myList.Contains(z.MyId)).ThenBy(z => z.MyString)) { 
      Console.WriteLine("{0} ==> {1}", c.MyId, c.MyString); 
     } 

     // I'm expecting this output: 
     // 
     // 15 ==> Entry4 
     // 5 ==> Entry6 
     // 8 ==> Entry1 
     // 12 ==> Entry2 
     // 1 ==> Entry3 
     // 9 ==> Entry5 
    } 

    public class MyClass { 
     public int MyId { get; set; } 
     public string MyString { get; set; } 
    } 
} 

正如你可以从我的预期的输出看,我想Entry6Entry4因为它们出现在第一个列表中第一次出现。然后我只想要一个按字母排序的列表。我认为我的LINQ声明是正确的,但它没有给我正确的结果。任何帮助,将不胜感激。

回答

3

只需翻转myList.Contains条件:

foreach (MyClass c in myclasses.OrderBy(z => !myList.Contains(z.MyId)).ThenBy(z => z.MyString)) { 
     Console.WriteLine("{0} ==> {1}", c.MyId, c.MyString); 
} 

我相信这是因为true作为1处理,而false0

1

使用此:

myclasses.OrderBy(z => !myList.Contains(z.MyId)).ThenBy(z => z.MyString)