2012-10-10 112 views
4

我試圖使用Enumerable.OrderBy排序列表,因爲最終我希望能夠通過多個字段進行排序。目前,只有當我創建一個新變量var來保存結果視圖時,它纔會起作用,這意味着(我認爲)這些類型需要重新投射。排序列表不創建新變量

有沒有一種方法來保存原始的List變量和類型的List超過1字段排序?即我寧願最終變量_orderedbins類型List<orderedbins>

下面是我目前有但從var test = ...起的一切似乎有點不對。

public class orderedBins 
{ 
    public string Bin { get; set; } 
    public int Order { get; set; } 
} 

List<orderedbins> _orderedbins = new List<orderedbins>(); 
foreach (string item in splitbins) 
{ 
    string[] spbinSetting = item.Split(','); 
    bool bchecked = bool.Parse(spbinSetting[1]); 
    int border = int.Parse(spbinSetting[2]); 

    if (bchecked == true) 
    { 
     _orderedbins.Add(new orderedbins { bin = spbinSetting[0], Order = border }); 
    } 
} 

var test =_orderedbins.OrderBy(x => x.Order); 
foreach (var item in test) 
{ 
    string f = item.Bin; 
    int g = item.Order; 
} 
+0

你的意思是變量(參考),或對象本身? –

+0

我的意思是變量(引用),我不需要保留原始列表順序 – user3357963

回答

5

你知道,你可以通過執行多個子排序以訂單...

lst.OrderBy(x => x.Prop1).ThenBy(x => x.Prop2).ThenByDescending(x => x.Prop3)... 

只需添加一個.ToList();和具有可變介紹它,有結果列表中的變量。

編輯:由威廉

偉大的建議,更多的可讀性:

from x in lst 
order by x.Prop1, x.Prop2, x.Prop3 
select x 
+1

儘管通常你會得到更多可讀代碼,如下所示:'從x開始按x.Prop1,x.Prop2,x.Prop3選擇x',它將節省您一遍又一遍地創建委託。 Upvoted你,因爲它只是答案,顯示如何訂購多個屬性。 –

+0

@WillemDuncan感謝您的提示!添加回答。 – SimpleVar

+1

爲了給答案增加更多內容,可以在需要的地方使用'descending'關鍵字,例如:'按x.Prop1排序,x.Prop2降序,x.Prop3' –

3

這將這樣的伎倆:

_orderedbins = _orderedbins.OrderBy(x => x.Order).ToList(); 

...但沒有真正的問題,創建一個新的變量/參考。

1

我想這會做到這一點(它已經orderbins的列表,以便沒有鑄造是必需的):

_orderbins = _orderbins.OrderBy(x => x.Order).ToList(); 
2

您可以創建新的已排序列表,而無需創建新變量使用

list = list.OrderBy(item => item.Field1).ThenBy(item => item.Field1).ToList(); 

它仍然會創建一個全新的列表(實際上添加一個新變量實際上並不是什麼大問題;那些便宜。只要列表不是很大,創建一個新列表就可以了。

如果需要排序到位列表,然後你要使用自定義比較與列表的排序方法:

public class MyComparer : IComparer<MyClass> 
{ 

    public int Compare(MyClass x, MyClass y) 
    { 
     if(x.Field1 != y.Field1) 
      return x.Field1.CompareTo(y.Field1) 
     else 
      return x.Field2.CompareTo(y.Field2); 
    } 
} 

List<MyClass> list = new List<MyClass>(); 
//Populate list 

list.Sort(new MyComparer()); 
2

至於其他人則建議,使用LINQ的OrderBy(...).ToList()將是一個更清潔的方式,但這會給你一個新的列表實例。

要保留原始例如,考慮到使用List<T>.Sort()

_orderedbins.Sort(new Comparison<orderedBins>((obj1, obj2) => 
{ 
    int result = obj1.Order.CompareTo(obj2.Order); 
    return result != 0 ? result : obj1.Bin.CompareTo(obj2.Bin); 
}));