【问题标题】:Order a List<T> by inner field of object按对象的内部字段对 List<T> 进行排序
【发布时间】:2012-08-22 21:50:02
【问题描述】:

考虑下面的代码

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

enum Place
{
    Left,
    Right
}

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

PinName 字段只能是数字或字母数字,所以我通过字符串来支持两者。

现在我的问题是,如果我有一个List&lt;Map&gt;,我如何按 Pin 的名称字段对这个列表进行排序?我尝试了下面的代码,但它无法编译:

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

【问题讨论】:

  • 你所拥有的实际上看起来不错......?你确定你的真实代码不是map = map.Sort(...); 吗?
  • 听起来您正在尝试将 map 设置为等于调用 Sort 的结果。跳过它(因为 sort 将重新排列您正在排序的列表中的元素)或使用 map = map.OrderBy(x => x.pin.Name).ToList();
  • @MarcGravell 看来我做错了分配,我的意思是在方法中返回排序结果。但我关于排序的问题仍然有效。
  • @Sean87 然后排序,然后返回; List&lt;T&gt;.Sort 方法是就地操作,因此没有返回值。即list.Sort(...); return list;

标签: c# linq list ienumerable


【解决方案1】:

您显示的代码不会产生该编译器错误。我假设您正在尝试将结果分配给新变量或自身。像这样的:

map = map.Sort(...);

这是不可能或没有必要的,因为 List&lt;T&gt;.Sort 正在执行 in-place 排序,即它会更改原始列表,因此不会返回任何内容。因此,简单地删除分配应该会使编译器错误消失。

如果您不想要就地排序,只需将Enumerable.OrderByToList 结合使用即可生成一个新列表:

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

【讨论】:

  • 听起来像 OP 只需要用 map.Sort(...); 替换 map = map.Sort(...);... 我只是说“删除 map = ”可能比 LINQ 更重要替代
  • @MarcGravell:是的。我刚才也是这么想的。正如你评论的那样,我已经改变了我的答案。请检查。
  • 我会说两者兼得很好,同时map = map.OrderBy(...).ToList()Sort()具有相同的效果,Sort()更快。相反,OrderBy(...) 优于 OrderBy(...).ToList(),但并不总是需要的。了解所有三种方法绝对是一件好事。
【解决方案2】:

LINQ 救援:

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

当然,假设地图中没有一个大头针是null。如果可以为null,则:

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

【讨论】:

  • 我不同意;这不符合问题的要求:它不对列表进行排序。
  • @MarcGravell 公平地说,因为看起来问题在于分配排序的结果,并且由于我们看不到分配是否返回到同一个列表,所以不清楚这并不是他们真正想要的。
  • @Jon hmmmm... 也许;事实上,在这一点上问题可能会更清楚。
【解决方案3】:

使用 Linq。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2011-05-16
    相关资源
    最近更新 更多