使用LINQ更新List <object>

时间:2015-04-30 08:27:38

标签: c# linq

我正在尝试使用LINQ向我的网格添加SELECT ALL功能,但是我收到了编译错误。

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

它说

  

无法隐式转换类型&#39; void&#39;至   &#39; System.Collections.Generic.List&lt;   LogoSapHrIntegration.frmXmlUpload.Person_&GT;&#39;

我做错了什么?

4 个答案:

答案 0 :(得分:4)

List<T>.ForEach没有返回值(即无效),因此您无法对此运行ToList()。 (见MSDN

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

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

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

答案 1 :(得分:1)

List<T>.ForEach返回void(在您的情况下,它会更改您的收藏)。 ForEach需要Action<T>并在列表的每个项目上执行该操作。

请参阅List(T).ForEach on MSDN

答案 2 :(得分:0)

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接口)。)

答案 3 :(得分:0)

首先,您可以使用普通的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;
});