2

我目前正在使用列表中包含的对象类型中的“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

4 回答 4

9

我不知道您的课程的详细信息,因此我将提供一个使用字符串列表和 LINQ 的示例。OrderBy将按字母顺序对字符串进行排序,ThenBy然后按长度对它们进行排序。您可以轻松地根据您的需要调整此示例。

var list = new List<string>
{
    "Foo",
    "Bar",
    "Foobar"
};
var sortedList = list.OrderBy(i => i).
    ThenBy(i => i.Length).
    ToList();
于 2013-01-04T16:41:50.940 回答
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;
}

PS 发布代码时,请尝试仅包含与您的问题相关的代码。您发布的代码中有很多我不需要阅读的东西,这实际上让我的眼睛受伤。

于 2013-01-04T16:44:55.293 回答
2

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

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

例如

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

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

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

于 2013-01-04T16:55:02.993 回答
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;
    }
于 2013-01-04T16:43:22.267 回答