c# - सी#में सूची<T> कैसे सॉर्ट करें
list sorting (3)
मुझे एक
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)'
आप, शायद, अपनी कक्षा की 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
));
आपको 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();