c# - 如何在C#中对List <T>进行排序

标签 c# list sorting

我有一个List<Card>,我想对这些卡片进行排序

因此,我正在寻找一种使用不同条件对它们进行排序的方法,例如IDName ...

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

但是随后,Visual Studio向我发送了一个错误:

'Card' does not implement interface member 'IComparer<Card>.Compare(Card, Card)'

最佳答案

您可能想让您的类(class)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);
    }
}

然后
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
));

关于c# - 如何在C#中对List <T>进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57371442/

相关文章:

c# - WCF 之外的项目中的 DataContract

c# - WCF 使用、关闭和扩展

c# - 在开发中使用 Azure Redis 缓存(预览版)

javascript - 用另一个数组更新一个数组(删除和添加值)

javascript - 按每个对象具有的属性对对象数组进行排序时出现异常结果

c# - 如何更改数据表中数据列的数据类型?

java - 在 Java 8 中使用映射函数时类型转换不起作用

Java 通用列表模板

.net - 我该如何解决?错误 : Select is not a member of 'System.Collections.Generic.List(Of String)'

分解元组列表的 pythonic 方法