2013-01-04 178 views
1

我目前正在使用列表中包含的对象类型中的'CompareTo'方法对C#列表进行排序。我想通过自己的WBS(工作分解结构)递增的所有项目进行排序,我可以管理这个很好用下面的代码:用两个参数对列表进行排序使用CompareTo

 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。我怎样才能做到这一点?

回答

9

我不知道你的类的细节,所以我会提供一个使用字符串和LINQ列表的例子。 OrderBy将按字母顺序排列字符串,ThenBy将按照其长度排序。您可以轻松地将此样本适应您的需求。

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

如何使用'OrderBy()'方法? –

+1

@JFB假设你使用的是.NET 3.5或更高版本,你需要在文件的'using'指令中包含:'using System.Linq;' – Mir

+0

oops!现在我很尴尬。谢谢! –

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; 
    } 
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 发布代码时,请尽量只包含与您的问题相关的代码。您发布的代码中存在大量内容,我不需要阅读,这实际上使我的眼睛受伤。

2

我喜欢夏娃的答案,因为它的灵活性,但我有点惊讶,没有人提到创建自定义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以上)

相关问题