property - order by list string c#
C#linq sort-forma rĂ¡pida de instanciar IComparer (5)
Cuando usas linq y tienes
c.Sort()
¿Hay alguna buena forma en línea de definir una clase de Comparison
y / o IComparer
sin tener que crear una clase separada?
Ese es uno de los usos de expresiones lambda:
c.Sort( (x,y) => xACompareTo(yA))
EDITAR : Ejemplo fijo para devolver int (usando CompareTo) en lugar de bool
La respuesta de Jon es genial, pero puede estar un poco desactualizada, con el lanzamiento de .NET 4.5 ahora tenemos ( ¡finalmente! ) Este increíble método Comparer<T>.Create
items.Sort((x, y) => x.Value.CompareTo(y.Value)); //sorting List<T>
items.OrderBy(x => x, Comparer<Item>.Create((x, y) => x.Value.CompareTo(y.Value))); //sorting IEnumerable<T>
Asumiendo el Item
se define algo así como:
class Item
{
public readonly int Key;
public readonly string Value;
public Item(int key, string value)
{
Key = key;
Value = value;
}
}
No tengo idea de qué es c.Sort()
en tu ejemplo, ya que pueden ser muchas cosas (¿te refieres a List<T>.Sort()
?), Pero una cosa que seguro no es es LINQ. LINQ no tiene Sort()
- tiene OrderBy()
.
Dicho esto, este último también funciona con IComparer
, y no hay forma de crear una instancia de clase anónima que implemente la interfaz "en línea", por lo que deberá definir una clase.
Para List<T>.Sort()
, hay una sobrecarga que toma la Comparison<T>
. Como es un tipo de delegado, puede usar un lambda para proporcionar la función en línea:
List<int> xs = ...;
xs.Sort((x, y) => y - x); // reverse sort
Si los objetos en la Lista c ya implementan IComparable, no necesitarás otro. Pero si necesita una comparación personalizada, puede implementar IComparer en una clase anidada. También puede usar una expresión lambda para crear un método de comparación sobre la marcha:
persons.Sort( (person1, person2) => person1.Age.CompareTo( person2.Age ) );
Tengo una clase ProjectionComparer
en MiscUtil , por lo que puedes hacer:
IComparer<Foo> comparer = ProjectionComparer<Foo>.Create(x => x.Name);
c.Sort(comparer);
El código también está en esta respuesta .
También puede crear una instancia de Comparison<T>
directamente con una expresión lambda, pero generalmente no me gusta la duplicación que conlleva. Habiendo dicho eso, a menudo termina siendo algo más corto ...
EDITAR: Como se señaló, a partir de .NET 4.5, use Comparer<T>.Create
para hacer lo mismo.