【问题标题】:update a List<Object> with LINQ [duplicate]使用 LINQ 更新 List<Object> [重复]
【发布时间】:2015-07-09 20:36:38
【问题描述】:

我正在尝试使用 LINQ 将 SELECT ALL 功能添加到我的网格中,但出现编译错误。

List<Person_> PeopleUpdated = People.ToList().ForEach(a => a.SELECTED = true).ToList();

上面写着

无法将类型“void”隐式转换为 'System.Collections.Generic.List '

我做错了什么?

【问题讨论】:

  • 怎么了:foreach(var p in People) p.SELECTED = true;?
  • PeopleIEnumerable?
  • 您是要更改每个 person 的 SELECTED 字段/属性,还是只是要过滤 SELECTED 人。如果是后者,它只是.Where(a =&gt; a.SELECTED)
  • PeopleUpdated 应该包含什么? - 所有选定人员的列表,或更新为选定人员的列表(即尚未选定的人员)。还是只是一个错误?

标签: c# linq


【解决方案1】:

List&lt;T&gt;.ForEach 没有返回值(即 void),因此您不能针对它运行 ToList()。 (见MSDN

ForEach 对列表中的每个项目执行特定操作(就像执行真正的 for 循环一样)。

在你的情况下,一个简单的 for 循环选择所有是最有效的。

foreach (var person in People)
    person.Selected = true

【讨论】:

  • 可能需要注意的是,如果 OP 想要更新 People 中的所有人,那么一个普通的 foreach 循环会更简单、更有效。
  • @TimSchmelter:同意 - 尽管其中的脏东西同时出现在 PeopleUpdated 列表中。认为 OP 希望这是一个单线,我不确定它是否可以。
  • 这不是“单行”吗:foreach(var p in People) p.SELECTED = true;?根据标题OP想要更新原来的列表,不需要创建一个新的。
  • 伙计们,问题是他想做什么并不完全清楚
  • @Leo 为什么不清楚?我很清楚。 OP 正在迭代集合以将 Selected 设置为 true。
【解决方案2】:

List&lt;T&gt;.ForEach 返回void(在您的情况下,它会更改您的集合)。 ForEach 接受 Action&lt;T&gt; 并在列表的每个项目上执行。

List(T).ForEach on MSDN

【讨论】:

  • 不知道是谁投了反对票
【解决方案3】:

ForEeach 方法(不是 LINQ)对列表中的每个项目运行一个操作,它不用于从列表中过滤掉项目,因此它不会返回结果。

只需在每个项目上运行该方法即可;没有要分配的结果:

People.ToList().ForEach(a => a.SELECTED = true);

如果您想要一个属性已更改的项目的新列表,您需要克隆这些项目以使其与原始项目分开:

List<Person_> PeopleUpdated = People.ToList().Select(a => {
  Person_ b = a.Clone();
  b.SELECTED = true;
  return b;
}).ToList();

(如果类不支持克隆,则需要实现Clone 方法(最好是IClonable 接口)。)

【讨论】:

  • 为什么需要克隆项目?
  • @Magnus:如果您想要一个具有更改值的新列表,则需要这样做。否则原始列表中的项目也会被更改。
  • 我认为这才是重点。
  • @Magnus:也许,也许不是。在原始代码中有一个新列表作为结果,我添加了代码来显示创建这样的结果需要什么。
【解决方案4】:

首先,你可以使用普通的foreach循环:

foreach (var person in people)
{
   person.Selected = true;
}

哪个是最简单最干净的。

如果你真的想跳槽并使用 LINQ,可以使用ConvertAll

var list = new List<Person> { new Person(), new Person() };
var convertedPeople = list.ConvertAll(person => 
{
    person.Selected = true;
    return person;
});

【讨论】:

  • 我不认为他在尝试修改列表...“我正在尝试将 SELECT ALL 功能添加到我的网格中”
  • @Leo 好吧,如果你想添加一个Select all 功能,你不想设置所有Selected 属性到true 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多