【问题标题】:Sorting a list with two parameters using CompareTo使用 CompareTo 对具有两个参数的列表进行排序
【发布时间】:2013-01-04 16:37:22
【问题描述】:

我目前正在使用列表中包含的对象类型中的“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)之前,我希望能够考虑多个参数(如项目名称中的字母顺序)进行排序。我该怎么做?

【问题讨论】:

    标签: c# list sorting compareto


    【解决方案1】:

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

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

    【讨论】:

    • 我怎样才能使用 'OrderBy()' 方法?
    • @JFB 假设您使用的是 .NET 3.5 或更高版本,您需要在文件的 using 指令中包含:using System.Linq;
    • 哎呀!现在我很尴尬。谢谢!
    【解决方案2】:

    在像您这样的情况下,我们通常会这样做:

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

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

    【讨论】:

      【解决方案3】:

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

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

      例如

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

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

      【讨论】:

        【解决方案4】:

        先按项目名称字母顺序比较,不相等则返回值,不相等则按第二个值进行比较

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-14
          • 1970-01-01
          • 1970-01-01
          • 2023-03-17
          • 2019-02-19
          • 1970-01-01
          • 2012-08-17
          相关资源
          最近更新 更多