我有一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是随后,Visual Studio向我发送了一个错误:
'Card'没有实现接口成员'IComparer<Card>.Compare(Card, Card)'
Dmi*_*nko 22
您可能希望让您的班级Comparable而不是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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后
List<Card> myList = ...
myList.Sort();
Run Code Online (Sandbox Code Playgroud)
编辑:如果要选择多个条件,则必须将多个比较器实现为单独的类,例如
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);
}
}
Run Code Online (Sandbox Code Playgroud)
并在排序时提供所需的信息:
List<Card> myList = ...
myList.Sort(new CardByIdComparer());
Run Code Online (Sandbox Code Playgroud)
编辑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;
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
myList.Sort(new ComparerCombined(
new CardByIdComparer(), // Sort By Id
new CardByNameComparer() // On tie (equal Id's) sort by name
));
Run Code Online (Sandbox Code Playgroud)
Har*_*ala 13
您可以使用Linq的最简单方法:
List<Card> objSortedList = objListObject.OrderBy(o=>o.ID).ToList();
Run Code Online (Sandbox Code Playgroud)
要么
List<Card> objSortedList = objListObject.OrderByDescending(o=>o.ID).ToList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1374 次 |
| 最近记录: |