使用CompareTo对包含两个参数的列表进行排序

时间:2013-01-04 16:37:22

标签: c# list sorting compareto

我目前正在使用列表中包含的对象类型中的'CompareTo'方法对C#列表进行排序。我想通过他们的WBS(工作分解结构)按升序排序所有项目,我可以使用以下代码很好地管理它:

        public int CompareTo(DisplayItemsEntity other)
        {
            string[] instanceWbsArray = this.WBS.Split('.');
            string[] otherWbsArray = other.WBS.Split('.');

            int result = 0;

            for (int i = 0; i < maxLenght; i++)
            {
                if (instanceWbsArray[i].Equals(otherWbsArray[i]))
                {
                    continue;
                }
                else
                {    
                    result = Int32.Parse(instanceWbsArray[i]).CompareTo(Int32.Parse(otherWbsArray[i]));
                    break;
                }
            }
            return result;
        }

现在,在考虑第二个WBS之前,我希望能够按字母顺序排序考虑多个参数,如项目名称。我怎么能这样做?

4 个答案:

答案 0 :(得分:9)

我不知道你班级的细节,所以我将提供一个使用字符串和LINQ列表的例子。 OrderBy将按字母顺序排列字符串,ThenBy将按照其长度对它们进行排序。您可以轻松地根据需要调整此样本。

var list = new List<string>
{
    "Foo",
    "Bar",
    "Foobar"
};
var sortedList = list.OrderBy(i => i).
    ThenBy(i => i.Length).
    ToList();

答案 1 :(得分:3)

我们在像您这样的案件中通常会这样做:

public int CompareTo( SomeClass other )
{
    int result = this.SomeProperty.CompareTo( other.SomeProperty );
    if( result != 0 )
        return result;
    result = this.AnotherProperty.CompareTo( other.AnotherProperty );
    if( result != 0 )
        return result;
    [...]
    return result;
}

P.S。 发布代码时,请尝试仅包含与您的问题相关的代码。您发布的代码中有大量内容我不需要阅读,这实际上让我的眼睛受伤了。

答案 2 :(得分:2)

我喜欢Eve的答案,因为它具有灵活性,但我很惊讶没有人提到创建自定义IComparer<T>实例

IComparer<T>是一个通用接口,它定义了一种比较类型T的两个实例的方法。使用IComparer<T>的优点是您可以为常用的每个排序顺序创建实现,然后在必要时使用它们。这允许您在类型CompareTo()方法中创建默认排序顺序,并单独定义替代订单。

E.g。

public class MyComparer
 : IComparer<YourType>
{
  public int Compare(YourType x, YourType y)
  {
     //Add your comparison logic here
  }
}

IComparer<T>对于组合特别有用,你可以使用比较器来比较给定类型的某些属性,使用另一个对属性类型进行操作的比较器。

如果您需要在不受控制的类型上定义排序,这也非常有用。它的另一个优点是它不需要LINQ,因此可以在旧代码(.Net 2.0以后)中使用

答案 3 :(得分:0)

首先按字母顺序比较项目名称,如果它们不等于返回值,如果不是基于第二个值执行比较

    public int CompareTo(DisplayItemsEntity other)
    {
       if(other.ProjectName.CompareTo(this.ProjectName) != 0)
       {
           return other.ProjectName.CompareTo(this.ProjectName)
       }

       //else do the second comparison and return


       return result;
    }