2017-03-15 88 views
1

我觉得这很简单,但我似乎无法弄清楚。OrderBy索引其他列表

如果我有这样的:

public class Program 
{ 
    public static void Main() 
    { 
     TestClass test1 = new TestClass(){ID = 1, text = "STRING ONE"}; 
     TestClass test2 = new TestClass(){ID = 2, text = "STRING TWO"}; 
     TestClass test3 = new TestClass(){ID = 3, text = "STRING THREE"}; 
     TestClass test4 = new TestClass(){ID = 4, text = "STRING FOUR"}; 

     List<TestClass> lstTestClasses = new List<TestClass>(); 
     lstTestClasses.Add(test1); 
     lstTestClasses.Add(test2); 
     lstTestClasses.Add(test3); 
     lstTestClasses.Add(test4); 

     List<string> lstCategories = new List<string>() { "STRING TWO", "STRING ONE", "STRING THREE"}; 

     var orderStrings = lstTestClasses.OrderBy(x => lstCategories.IndexOf(x.text)).ToList(); 

     foreach(var item in orderStrings) 
     { 
      Console.WriteLine(item.text); 
     } 

     // Output: 
      STRING FOUR 
      STRING TWO 
      STRING ONE 
      STRING THREE 
    } 
} 

public class TestClass 
{ 
     public int ID { get; set; } 
     public string text { get; set; } 
} 

我怎么STRING FOUR来最后,而不是第一个,因为它不是在lstCategories包括在内?

任何帮助表示赞赏。

回答

1

你可以尝试这样的事情:

int i = 0; 
var orderStrings = lstTestClasses.OrderBy(x => 
           (i = lstCategories.IndexOf(x.text)) < 0 ? int.MaxValue : i) 
           .ToList(); 
+0

那么,是什么的'-1'变成与'int.MaxValue'? –

+0

@BviLLe_Kid'-1'小于'0',所以如果'IndexOf'返回'-1',那么'OrderBy'将会接收'int.MaxValue'。 – Abion47

+0

我得到那部分,我只是问'int.MaxValue'的值是什么? –

0

由于值没有找到,IndexOf回报-1从而将其置于在集合的开始一路。

我建议检查IndexOf是否小于0,如果是,请将其设置为Int32.MaxValue以便将其置于集合的末尾。

如:

TestClass test1 = new TestClass() { ID = 1, text = "STRING ONE" }; 
TestClass test2 = new TestClass() { ID = 2, text = "STRING TWO" }; 
TestClass test3 = new TestClass() { ID = 3, text = "STRING THREE" }; 
TestClass test4 = new TestClass() { ID = 4, text = "STRING FOUR" }; 

List<TestClass> lstTestClasses = new List<TestClass>(); 
lstTestClasses.Add(test1); 
lstTestClasses.Add(test2); 
lstTestClasses.Add(test3); 
lstTestClasses.Add(test4); 

List<string> lstCategories = new List<string>() { "STRING TWO", "STRING ONE", "STRING THREE" }; 

var orderStrings = lstTestClasses.OrderBy(x => { 
    var index = lstCategories.IndexOf(x.text); 
    return index < 0 ? Int32.MaxValue : index; 
}).ToList(); 

foreach (var item in orderStrings) 
{ 
    Console.WriteLine(item.text); 
}