2012-08-28 123 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>();