c# list sorting

Cómo ordenar la Lista<T> en c#



sorting (4)

La forma más fácil de usar Linq:

List<Card> objSortedList = objListObject.OrderBy(o=>o.ID).ToList();

o

List<Card> objSortedList = objListObject.OrderByDescending(o=>o.ID).ToList();

Tengo una List<Card> , y quiero ordenar estas tarjetas

Entonces, estoy buscando un método para ordenarlos con diferentes criterios, como su ID , su Name ...

public class Card : IComparer { public string ID; public string Name; public int CompareId(object firstCard, object secondCard) { Card c1 = (Card)firstCard; Card c2 = (Card)secondCard; return c1.Id.CompareTo(c2.Id); } }

Pero entonces, Visual Studio me envió un error:

''Card'' no implementa el miembro de interfaz ''IComparer<Card>.Compare(Card, Card)''


Necesita implementar IComparer

public int Compare(Card card1, Card card2) { if (card1.ID > card2.ID) return 1; //move card1 up if (card2.ID < card1.ID) return -1; //move card2 up return 0; //do nothing }


Probablemente quieras tener tu clase Comparable no un Comparator

public class Card : IComparable<Card> { public string ID; public string Name; public int CompareTo(Card other) { if (null == other) return 1; // string.Compare is safe when Id is null return string.Compare(this.Id, other.Id); } }

entonces

List<Card> myList = ... myList.Sort();

Editar: si desea tener varios criterios para elegir, debe implementar varios comparadores como clases separadas, p. Ej.

public sealed class CardByIdComparer : IComparer<Card> { public int Compare(Card x, Card y) { if (object.ReferenceEquals(x, y)) return 0; else if (null == x) return -1; else if (null == y) return 1; else return string.Compare(x.Id, y.Id); } }

y al ordenar proporcione lo requerido:

List<Card> myList = ... myList.Sort(new CardByIdComparer());

Edición 2: (inspirado en la biblioteca del gastador). Si desea combinar varios comparadores en uno (es decir, use comparer1 , en empate - comparer2 etc.)

public sealed class ComparerCombined<T> : IComparer<T> { private IComparer<T>[] m_Comparers; public ComparerCombined(params IComparer<T>[] comparers) { if (null == comparers) throw new ArgumentNullException(nameof(comparers)); m_Comparers = comparers .Select(item => item == null ? Comparer<T>.Default : item) .Where(item => item != null) .Distinct() .ToArray(); } public int Compare(T x, T y) { if (object.ReferenceEquals(x, y)) return 0; else if (null == x) return -1; else if (null == y) return 1; foreach (var comparer in m_Comparers) { int result = comparer.Compare(x, y); if (result != 0) return result; } return 0; } }

uso:

myList.Sort(new ComparerCombined( new CardByIdComparer(), // Sort By Id new CardByNameComparer() // On tie (equal Id''s) sort by name ));


Buenos ejemplos para demostrar el concepto de
List<T>.Sort(IComparer <T>) verifique el enlace por favor.

IComparer<T> en este ejemplo compara el método utilizado para las cadenas IComparer<T> pero también puede usarlo para ID (int).

using System; using System.Collections.Generic; class GFG : IComparer<string> { public int Compare(string x, string y) { if (x == null || y == null) { return 0; } // "CompareTo()" method return x.CompareTo(y); } } public class geek { public static void Main() { List<string> list1 = new List<string>(); // list elements list1.Add("C++"); list1.Add("Java"); list1.Add("C"); list1.Add("Python"); list1.Add("HTML"); list1.Add("CSS"); list1.Add("Scala"); list1.Add("Ruby"); list1.Add("Perl"); int range = 4; GFG gg = new GFG(); Console.WriteLine("/nSort a range with comparer:"); // sort the list within a // range of index 1 to 4 // where range = 4 list1.Sort(1, range, gg); Console.WriteLine("/nBinarySearch and Insert Dart"); // Binary Search and storing // index value to "index" int index = list1.BinarySearch(0, range, "Dart", gg); if (index < 0) { list1.Insert(~index, "Dart"); range++; } } }