按自定义比较器对具有重复键的列表进行排序

本文关键字:列表 排序 比较器 自定义 | 更新日期: 2023-09-27 18:15:07

我有MyValue类型的List inputColl具有许多重复密钥:

myValue1.Id=100;
myValue2.Id=100;
...etc

和我有自定义比较器比较Id两个MyValue元素:

inputColl.Sort(myValueComparer);

我做错了什么?

比较器:

public class MyValueComparerById : IComparer<MyValue>
{
    public int Compare(MyValue x, MyValue y)
    {
        if (x.Id == y.Id)
            return 0;
        else if (x.Id > y.Id)
            return -1;
        else if (x.Id < y.Id)
            return 1;
        return 0;
    }
}

按自定义比较器对具有重复键的列表进行排序

除非您的相等比较器实现得不差,否则您的解决方案应该有效。

但是我建议一个更简单的方法,使用linq:

inputCol = inputCol.OrderBy(o => o.Id).ToList();

您已经有一个int比较器,所以最好使用它而不是重写相同的逻辑:

public class MyValueComparerById : IComparer<MyValue>
{
    public int Compare(MyValue x, MyValue y)
    {
         return x.Id.CompareTo(y.Id);        
    }
}

**更新编辑**

对于进一步的改进,您可能需要考虑在Id相等的情况下进行额外的比较:

public class MyValueComparerById : IComparer<MyValue>
{
    public int Compare(MyValue x, MyValue y)
    {
        var firstResult = x.Id.CompareTo(y.Id);        
        if (firstResult == 0)
        {
            // I'm assuming that MyValue has an additional string property named 'SomeName'
            return x.SomeName.CompareTo(y.SomeName);
        }
        return firstResult;
    }
}