2011-10-13 21 views
5

Mam kolekcję nazw plików, których część ścieżki jest określona. Mogę zamówić kolekcję takiego:Sortowanie kolekcji na podstawie innej kolekcji

var files = from f in checkedListBox1.CheckedItems.OfType<string>() 
      orderby f.Substring(0,3) 
      select f; 

Ale teraz nie chcę sortować według kolejności alfabetycznej nazw plików na części ale według określonej kolejności podanej przez innego zbioru.

Załóżmy, że częścią ścieżki może być "ATE", "DET" i "RTI". Mam kolejną kolekcję ciągów: {"DET", "ATE", "RTI"}, której chcę użyć do sortowania nazw plików, aby po sortowaniu nazwy plików były wyświetlane z ich partname w kolejności "DET" najpierw, następnie "ATE" , a następnie "RTI". Jak to osiągnąć -> trzeba użyć własnego porównywalnika?

+0

możliwe duplikat [C# sortowania listy na podstawie innej listy] (http://stackoverflow.com/questions/3355928/c-sharp-sort-list-based-on-another-list) – nawfal

Odpowiedz

2

Trzy różne warianty, w zależności czy chcesz korzystać string[], List<string> lub Dictionary<string, int> (dobre tylko wtedy, gdy mają elementy wielu szukać)

string[] collection = new[] { "DET", "ATE", "RTI" }; 
var files = from f in checkedListBox1.CheckedItems.OfType<string>() 
      orderby Array.IndexOf(collection, f.Substring(0, 3)) 
      select f; 

List<string> collection2 = new List<string> { "DET", "ATE", "RTI" }; 
var files2 = from f in checkedListBox1.CheckedItems.OfType<string>() 
      orderby collection2.IndexOf(f.Substring(0, 3)) 
      select f; 

Dictionary<string, int> collection3 = new Dictionary<string, int> 
      { { "DET", 1 }, { "ATE", 2 }, { "RTI", 3 } }; 

Func<string, int> getIndex = p => 
{ 
    int res; 
    if (collection3.TryGetValue(p, out res)) 
    { 
     return res; 
    } 
    return -1; 
}; 

var files3 = from f in checkedListBox1.CheckedItems.OfType<string>() 
       orderby getIndex(f.Substring(0, 3)) 
       select f; 

I Dodam, że LINQ nie ma "generycznej" metody IndexOf, ale można ją zbudować tak, jak tu napisano: How to get index using LINQ?

6

To powinno działać

var files = from f in checkedListBox1.CheckedItems.OfType<string>() 
     orderby anotherCollection.IndexOf(f.Substring(0,3)) 
     select f; 
+0

Tylko jeśli "anotherColletion" to 'List ' :-) (lub inny typ kolekcji, który ma metodę instancji 'IndexOf' .Apliki na przykład jej nie mają) – xanatos

0

Jeśli twój problem jest tak prosty, jak to określiłeś, a są tylko 3 możliwe prefiksy, możesz to zrobić.

var fileNames = checkedListBox1.CheckedItems.OfType<string>(); 
var files = fileNames.OrderBy(f => 
{ 
    int value = int.MaxValue; 
    switch (f.Substring(0, 3)) 
    { 
     case "DET": 
      value = 1; 
      break; 
     case "ATE": 
      value = 2; 
      break; 
     case "RTI": 
      value = 3; 
      break; 
    } 
    return vakue; 
}); 
Powiązane problemy