2010-02-26 74 views
7

我有一个对象列表,需要根据对象的三个不同属性进行排序。 例使用比较器在C#中按不同字段对IEnumerable进行排序

CLass Object1{ Property1 , Property2, Property3} 

ListObj = IEnumerable<Object1> 

Foreach (item in ListObj){ 

    if (item.Property1 == true) 
     item goes at top of list 
    if(item.Property2 == true) 
     item goes end of list 
    if(item.Property3 == true) 
     item can go anywhere. 
} 

最终名单应该与Property1与Property2 =真与Property3 =对象=真其次是物体,然后物体真实

+0

其实这个有点不清楚。我认为带有property3的物品可以去任何地方? – 2010-02-26 21:59:40

+0

我想我现在明白了......为了更好地反映情况,我改变了下面的答案。 – 2010-02-26 22:00:25

+0

目前还不清楚,因为存在优先问题。代码读取一种方式(列表的末尾覆盖列表的前面),但我怀疑你的意思是另一种方式(列表的前面覆盖列表的末尾) – 2010-02-26 22:09:11

回答

7

为什么不使用LINQ?

var orderedList = 
    ListObj.OrderByDescending(x => x.Property1) 
      .ThenByDescending(x => x.Property2); 
+0

之前按OP要求提供正确的排序。 – AxelEckenberger 2010-02-26 22:00:06

+1

@Obalix:OP所指示的正确排序是什么?他指出了两种可能性......他的代码暗示了一种可能性,而代码之后的文本则暗示了另一种可能性。顺便说一下,真正的事情发生在一个简单的OrderBy之后。 OrderByDescending使真正的第一。 – 2010-02-26 22:13:42

+0

你说得对,对不起! – AxelEckenberger 2010-02-26 22:24:39

4

你自己的标题已经说明了一切:实现自定义IComparer<Object1>并把它传递给OrderBy扩展方法:

var orderedItems = ListObj.OrderBy(obj => obj, customComparer); 
1

这应该提供所需的排序(按代码,而不是声明下面)。

ListObj.Where(x => x.Property1 == true) 
     .Concat(ListObj.Where(x => x.Property1 == false && x.Property2 == false)) 
     .Concat(ListObj.Where(x => x.Property2 == true)); 
2

可以让事情更整洁了自己,如果你定义了这个类型:

public class ComparisonComparer<T> : IComparer<T> 
    { 
     private readonly Comparison<T> _comparison; 

     public ComparisonComparer(Comparison<T> comparison) 
     { 
      _comparison = comparison; 
     } 

     public int Compare(T x, T y) 
     { 
      return _comparison(x, y); 
     } 
} 

它可以让你用一个lambda表达式的LINQ语句定义内置的比较。

1

我想你想定义一个比较函数,你可以在这里确定列表中任何2个项目之间的等级。

int CompareObject1(Object1 left, Object1 right) 
    { 
     // TODO: cases where your items are null 

     // compare Property1 values 
     if (left.Property1) 
     { 
      if (right.Property1) 
      { 
       // items at same rank 
       return 0; 
      } 
      else 
      { 
       // left item is higher rank than right 
       return -1; 
      } 
     } 
     else if (right.Property1) 
     { 
      // right item is higher rank than left 
      return 1; 
     } 

     // Property1 doesn't indicate position, move along 
     // TODO: repeat for Property2 

     // Property2 doesn't indicate position, move along 
     // TODO: repeat for Property3 

     // if we get here, no determination can 
     // be made/don't bother to move anything 
     return 0; 
    } 

返回值指示左对象或右对象应该以-1还是1(或0为优先)排名较高。只要确保你覆盖了所有的条件。

那么如果你是倒着显示列表结束了,你可以使用这个喜欢

List<Object1> foo = new List<Object1>() { <items...> }; 
foo.Sort(CompareObject1); 

,我大概翻的比较功能的迹象。你的排序规则是相互矛盾的,所以我会让你对Property2和Property3进行排序。

相关问题