2012-08-28 121 views
2

的內部場列表 考慮下面 排序對象

class Pin 
{ 
    string Name; //can be either Numerical or AlphaNum 
} 

enum Place 
{ 
    Left, 
    Right 
} 

class Map 
{ 
    Pin pin; 
    Place Place; 
    Rectangle Rect; 
} 

PinName字段中的代碼可以是僅數字或字母數字,讓我去由串來支持這兩者。

現在我的問題是,如果我有一個List<Map>我怎麼能按Pin的名字字段排序這個列表?我試過下面的代碼,但它無法編譯:

map.Sort((x, y) => x.Pin.Name.CompareTo(y.Pin.Name)); 
//Cannot implicitly convert type 'void' to 'System.Collections.Generic.List<DataModels.PinMap> 
+0

看看http://stackoverflow.com/questions/3163922/sort-a-custom-class-list – Tomtom

+1

你有什麼實際看起來不錯......?你確定你的真實代碼不是'map = map.Sort(...);'? –

+0

聽起來就像你試圖設置地圖等於調用Sort的結果。跳過(排序會重新排列列表中的元素)或使用map = map.OrderBy(x => x.pin.Name).ToList(); – mlorbetske

回答

9

您顯示的代碼不會產生該編譯器錯誤。我假設你正試圖將結果分配給一個新的變量或自己。事情是這樣的:

map = map.Sort(...); 

那是不可能的,或者必要的List<T>.Sort做一個就地排序,即它改變了原來的名單,因此不返回任何東西。所以,簡單地刪除這個賦值應該會讓編譯器錯誤消失。

如果你不想就地排序,簡單地結合使用Enumerable.OrderByToList產生一個新的列表:

var result = map.OrderBy(x => x.pin.Name).ToList(); 
+1

聽起來像OP,我只需要用'map.Sort(...);'來替換'map = map.Sort(...);''我只是說「刪除'map ='「可能更重要,比LINQ替代方案更重要 –

+0

@MarcGravell:是的。這就是我現在想的。正如你所評論的,我已經改變了我的答案。請檢查。 –

+0

我認爲這兩者都是好的,但它遵循'map = map.OrderBy(...)。ToList()'和Sort()'有相同的效果,'Sort()'更快。相反,'OrderBy(...)'擊敗'OrderBy(...).ToList()',但並不總是需要的。瞭解所有三種方法絕對是一件好事。 –

1

LINQ救援:

var ordered = map.OrderBy(x => x.pin.Name); 

假設,當然,地圖中沒有任何針腳是null。如果它可以爲空,則:

var ordered = map.Where(x => x.pin != null).OrderBy(x => x.pin.Name); 
+0

我不同意;這不會做問題的問題:它不排序列表。 –

+0

@MarcGravell公平,因爲看起來問題是分配排序結果,而且由於我們沒有看到這個任務是否返回到同一個列表中,所以並不清楚這不是什麼他們真的想要。 –

+0

@Jon嗯嗯...也許;事實上,這個問題可能會更清晰。 –

0

使用Linq。

map = (from a in allAgents 
     orderby a.AgentId 
     select a).ToList<Map>();