2010-02-26 77 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進行排序。

相關問題