使用LINQ更新List 注意:请不要翻译HTML标签和引号内的内容。
16 浏览
0 Comments

使用LINQ更新List 注意:请不要翻译HTML标签和引号内的内容。

我试图使用LINQ为我的网格添加“全选”功能,但是我遇到了编译错误。

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

它说

无法隐式转换类型“void”为

“System.Collections.Generic.List <

LogoSapHrIntegration.frmXmlUpload.Person_>”

我做错了什么?

0
0 Comments

从上述内容我们可以看出,问题的出现主要是因为使用了错误的方法(ForEach方法)来更新列表中的对象。ForEach方法并不是LINQ方法,它只是在列表中的每个对象上执行一个操作,并没有返回结果。因此,无法使用ForEach方法来过滤列表中的对象或返回一个新的列表。

为了解决这个问题,我们需要使用LINQ方法来更新列表中的对象。可以使用Select方法来对每个对象进行操作,并返回一个新的列表。在这个例子中,我们需要将SELECTED属性设置为true。但是,由于在原始列表中进行操作会改变原始对象,所以我们需要先克隆对象,使其与原始对象分离。如果对象的类不支持克隆操作,我们需要实现克隆方法(最好实现ICloneable接口)。

为什么需要克隆对象呢?因为如果我们想要得到一个具有更改值的新列表,那么就需要克隆对象。否则,原始列表中的对象也会被更改。

当然,有人可能会认为在原始列表中进行更改是一个优势。但是,在原始代码中,结果是一个新的列表,所以我添加了一些代码来展示如何创建这样的结果。

通过使用LINQ方法来更新列表中的对象,并在需要时克隆对象,我们可以解决(update a List with LINQ)这个问题。以下是解决方法的示例代码:

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

希望这篇文章能够帮助你理解如何通过LINQ来更新列表中的对象。

0
0 Comments

问题的出现原因:在使用List的ForEach方法时,它会直接修改集合本身,并且ForEach方法返回的是void类型。ForEach方法接受一个Action委托作为参数,并对列表中的每个元素执行该委托。

解决方法:使用LINQ的方式来更新List中的对象。可以使用Select方法来创建一个新的集合,其中的元素是根据原始集合中的元素进行更新后的结果。然后,可以通过ToList方法将新的集合转换为List对象。

代码示例:

List list = new List(); 
// 添加元素到列表中
List updatedList = list.Select(item => {
    // 更新每个元素的逻辑
    // 返回更新后的元素
}).ToList();

以上代码中,通过Select方法对原始列表中的每个元素进行更新操作,并将更新后的元素添加到新的集合中。最后,通过ToList方法将新的集合转换为List对象。

这样,就可以通过LINQ的方式来更新List中的对象,而不是使用List的ForEach方法直接修改集合本身。

0
0 Comments

问题的出现的原因是因为List<T>.ForEach方法没有返回值,因此无法对其运行ToList()方法。而问题的解决方法是使用简单的for循环来选择所有的项,这样最高效。可以使用以下代码实现:

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

另外,需要注意的是,如果OP想要更新People列表中的所有person,使用普通的foreach循环更简单和更高效。

某些情况下可以使用以下一行代码来实现更新:

foreach(var p in People) p.SELECTED = true;

根据问题标题,OP想要更新原始列表,并不需要创建一个新的列表。

但是也有人对OP的意图表示不太清楚,对于PeopleUpdated最终的结果不太明确。

以上是关于如何使用LINQ更新List<Object>的的问题。

0