9

我有一个对象列表,需要根据对象的三个不同属性对其进行排序。例子

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 = true 的对象,然后是 Property2 = true 的对象,然后是 Property3 = true 的对象

4

5 回答 5

8

为什么不使用 LINQ?

var orderedList = 
   ListObj.OrderByDescending(x => x.Property1)
          .ThenByDescending(x => x.Property2);
于 2010-02-26T21:57:37.713 回答
8

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

var orderedItems = ListObj.OrderBy(obj => obj, customComparer);
于 2010-02-26T21:59:39.097 回答
3

如果你定义这种类型,你可以让事情变得更整洁:

  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 语句内联的比较。

于 2010-02-26T22:31:35.693 回答
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 进行排序。

于 2010-02-26T22:58:08.663 回答
1

这应该提供所需的排序(根据代码,而不是下面的语句)。

ListObj.Where(x => x.Property1 == true)
       .Concat(ListObj.Where(x => x.Property1 == false && x.Property2 == false))
       .Concat(ListObj.Where(x => x.Property2 == true));
于 2010-02-26T22:02:30.030 回答