2017-03-15 2 views
1

Ich fühle mich wie das ist einfach, aber ich kann nicht scheinen, es herauszufinden.OrderBy IndexOf eine andere Liste

Wenn ich dieses:

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; } 
} 

Wie erhalte ich STRING FOUR letzte und nicht erst zu kommen, da es nicht in lstCategories enthalten?

Jede Hilfe wird geschätzt.

Antwort

1

Sie können so etwas wie dies versuchen:

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

so was macht der '-1' mit' int.MaxValue' verwandeln sich in? –

+0

@BviLLe_Kid '-1' ist kleiner als' 0', wenn 'IndexOf'' -1' zurückgibt, dann wird 'OrderBy' stattdessen' int.MaxValue' erhalten. – Abion47

+0

Ich bekomme diesen Teil, ich fragte nur, was ist der Wert von "int.MaxValue"? –

0

Da der Wert nicht gefunden wird, IndexOf kehrt -1, die es den ganzen Weg zu Beginn der Sammlung stellt.

Ich schlage vor zu überprüfen, ob IndexOf ist weniger als 0, wenn dann, setzen Sie es auf Int32.MaxValue, um es am Ende der Sammlung zu platzieren.

Wie in:

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); 
} 
Verwandte Themen