2011-10-13 27 views
5

Tengo una colección de nombres de archivos con parte de la ruta siendo una palabra específica. Puedo pedir la colección de esta manera:Ordenar una colección basada en otra colección

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

Pero ahora, quiero ordenar por orden alfabético, no por parte ruta pero de acuerdo con un orden específico determinado por la otra colección.

Digamos que la parte del nombre de ruta puede ser "ATE", "DET" y "RTI". Tengo otra colección de cadenas: {"DET", "ATE", "RTI"} que quiero usar para ordenar los nombres de los archivos para que después de ordenarlos, los nombres de los archivos aparezcan con su nombre de parte en el orden "DET" primero, luego "ATE" , luego "RTI". ¿Cómo logro esto -> necesito usar un comparador propio?

+0

posible duplicado de [C# Lista Ordenar Basado en otra lista] (http://stackoverflow.com/questions/3355928/c-sharp-sort-list-based-on-another-list) – nawfal

Respuesta

2

tres variantes diferentes, dependiendo de si desea utilizar string[], List<string> o una Dictionary<string, int> (bueno sólo si tiene muchos elementos para buscar)

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 Añadiré que LINQ no tiene un método "genérico" IndexOf, pero puede compilar uno como está escrito aquí How to get index using LINQ?

6

Esto debería funcionar

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

Sólo si 'anotherColletion' es una' List ':-) (o algún otro tipo de colección que tenga un método de instancia' IndexOf'. Las matrices, por ejemplo, no lo tienen) – xanatos

0

Si su problema es tan simple como usted indica y solo hay 3 posibles prefijos, puede hacerlo.

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; 
}); 
Cuestiones relacionadas