使用 LINQ 设置列表值

3

你好,我想在符合where子句条件的对象列表中设置值。这是否可能?另一种解决方法是使用where子句获取对象列表,然后使用for或foreach循环迭代并更新值。

listOfRequestAssigned.Where(x => x.RequestedNumber == CurrentRequest);

我有一个对象列表listOfRequestAssigned,想要更新符合搜索条件的对象的某些属性。

class Request
 {
 bool _requestCompleted;
   int _requestedNumber;
     public int RequestedNumber 
    {
        get { return _requestedNumber; }
        set { _requestedNumber = value; }
    }
    public bool RequestCompleted
    {
        get { return _requestCompleted; }
        set { _requestCompleted = value; }
    }
 }

我想使用Linq更新符合某些条件的所有对象的RequestCompleted属性。


小心,在Where语句中,使用“==”进行比较;是的,你可以使用Linq在一行代码中完成你的工作。 - Xaruth
是的,我做了更改。编译时出现异常;)感谢您的帮助@ Xaruth - lokendra jayaswal
4个回答

11

您可以在 Linq 中使用 ForEach

listOfRequestAssigned.Where(x => x.RequestedNumber == CurrentRequest).ToList().ForEach(x => x.RequestCompleted = true);

如果您需要进行多个更新,

listOfRequestAssigned.Where(x => x.RequestedNumber == CurrentRequest).ToList().ForEach(x =>  { x.RequestCompleted = true; x.OtherProperty = value; } );

Where(...)给你一个查询结果,而不是一个Request或一个List<Request>。如果要获取一个(或 0)结果,请使用FirstOrDefault();如果要获取一组结果以便使用ForEach(),请使用ToList()


在 where 条件之后没有 foreach。我已经检查了代码。它不起作用。 - lokendra jayaswal
@ Xaruth,我错了。是的,这是可能的。这个也可以。 - lokendra jayaswal
使用.ToList()将查询转换为列表,这样您就可以处理它。 - Xaruth

2
通常情况下,Linq 是一个查询工具而不是更新工具,但你可以使用 foreach
var currentRequests =  listOfRequestAssigned
    .Where(x => x.RequestedNumber == CurrentRequest);
foreach(var req in currentRequests)
{
    req.RequestCompleted = true;
}

@ Tim Schmelter先生。我想知道是否可以通过linq实现。Foreach肯定是一个选项。谢谢您,先生.. :) - lokendra jayaswal
@Tim,有没有一种方法可以在单行中更新列表的每个元素,而不是编写繁琐的foreach(var req in currentRequests) { req.RequestCompleted = true; }? - Bellash

1

既然你有特定类型为List的集合,那么你可以使用ForEach和条件设置:

listOfRequestAssigned.Foreach(x => { if (x.RequestedNumber == CurrentRequest) x.RequestCompleted = true;}});

如果您有一个更通用的集合 IEnumerable,您可以在 Linq 中使用 Select 来构建一个投影,其中属性将被设置为期望的值(原始集合将保持不变!):
listOfRequestAssigned
.Where(x => x.RequestedNumber == CurrentRequest)
.Select(x => { x.RequestCompleted = true; return x; })

0
您可以使用比较时间的方法来分配布尔值。这是为bool属性提供的最简单和最智能的方法。
    listOfRequestAssigned.ForEach(x => x.RequestCompleted = x.RequestedNumber 
    == CurrentRequest);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接