c# - सी#में सूची<T> कैसे सॉर्ट करें




list sorting (3)

आप, शायद, अपनी कक्षा की Comparator एक 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);
    }
}

फिर

List<Card> myList = ...

myList.Sort();

संपादित करें: यदि आप चुनने के लिए कई मानदंड रखना चाहते हैं, तो आपको अलग-अलग वर्गों के रूप में कई तुलनाओं को लागू करना होगा, जैसे

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

और जब छंटाई आवश्यक प्रदान करें:

List<Card> myList = ...

myList.Sort(new CardByIdComparer());

2 संपादित करें: (स्पेंडर लाइब्रेरी द्वारा प्रेरित)। यदि आप कई तुलनाओं को एक में संयोजित करना चाहते हैं (अर्थात comparer1 - comparer2 आदि का उपयोग करें)।

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;
  }
}

उपयोग:

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

मुझे एक List<Card> मिली है, और मैं इन कार्डों को क्रमबद्ध करना चाहता हूं

इसलिए, मैं उनकी ID , उनके 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);
    }
}

लेकिन फिर, दृश्य स्टूडियो ने मुझे एक त्रुटि भेजी:

'Card' इंटरफ़ेस सदस्य को लागू नहीं करता है 'IComparer<Card>.Compare(Card, Card)'


आपको 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
}

सबसे आसान तरीका आप Linq का उपयोग कर सकते हैं:

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

या

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




sorting