2011-11-16 10 views
6

¿Existe un método de creación .NET que resuelva mi situación?C# - Clasificación de cadenas por otra cadena como ayudante

  1. Tenemos una serie de cadenas, por ej. { "Mark", "Tom", "Mat", "Mary", "Peter" }
  2. utilizo cadena "Ma" como ordenar cadena ayudante
  3. Mi resultado matriz es { "Mark", "Mary", "Mat", "Tom", "Peter" }

sé que la función de resolver esto sería fácil, pero es I'am interesados ​​que, de existir.

PS. Usando .NET 4.0

+0

Las cadenas que tienen el índice correspondiente que debe ordenarse. ¿Qué pasa con las otras cadenas que no tienen la cadena correspondiente? Si lo desea, puede filtrar todas las cadenas coincidentes y clasificarlas y finalmente agregar la lista con los elementos restantes. –

+0

¿Cuál es la ventaja de ordenar elementos que coinciden solo con el prefijo especificado mientras se dejan los otros elementos en su ordenamiento relativo original? ¿Los elementos ordenados siempre terminan al principio? –

+0

Tarea, si es así por favor etiquetarlo. –

Respuesta

17

Usando .Net 3.5 (y superior) OrderByDescending y ThenBy métodos en Linq podrán hacer lo que quieras. por ejemplo:

var ordered = strings.OrderByDescending(s => s.StartsWith("Ma")).ThenBy(s => s); 
+0

Brillante: ¡votado! – Marco

+0

Thx exactamente lo que quería :) – EOG

+0

Este de linq-fu es fuerte. +1 – ddysart

1

Creo que ese método no existe.
he resuelto con esto:

public static string[] Sort(this string[] list, string start) 
{ 
    List<string> l = new List<string>(); 
    l.AddRange(list.Where(p => p.StartsWith(start)).OrderBy(p => p)); 
    l.AddRange(list.Where(p => !p.StartsWith(start)).OrderBy(p => p)); 
    return l.ToArray(); 
} 

para que pueda hacer

string[] list = new string[] { "Mark", "Tom", "Mat", "Mary", "Peter" }; 
string[] ordered_list = list.Sort("Ma"); 

Si necesita ordenar los elementos con su cuerda y dejar a otros sin clasificar, utilizar esto:

public static string[] Sort(this string[] list, string start) 
{ 
    List<string> l = new List<string>(); 
    l.AddRange(list.Where(p => p.StartsWith(start)).OrderBy(p => p)); 
    l.AddRange(list.Where(p => !p.StartsWith(start))); 
    // l.AddRange(list.Where(p => !p.StartsWith(start)).OrderByDescending(p => p)); 
    return l.ToArray(); 
} 
Cuestiones relacionadas