我需要更新IEnumerable列表中的值。
下面是一个简单的IEnumerable示例:
IEnumerable<string> allsubdirs = new List<string>() { "a", "b", "c" };
现在,如果我想为每个项目添加时间戳,这将不起作用:
allsubdirs.Select(a => a = a + "_" + DateTime.Now.ToString("hhmmss")).ToList();
这也不适用:
foreach (var item in allsubdirs)
item = item + "_" + DateTime.Now.ToString("hhmmss");
我是这样设计的:
IEnumerable<string> newallsubdirs = allsubdirs.Select(a => a + "_" + DateTime.Now.ToString("hhmmss")).ToList();
allsubdirs = newallsubdirs;
但这似乎有点像作弊。请问正确的做法是什么?
5条答案
按热度按时间lp0sw83n1#
Linq用于 * 查询 *,而不是 * 更新 *。Linq查询基于投影、过滤器等返回一个 * 新 * 集合(或源集合顶部的迭代器)。因此,您的选择是:
IList<T>
之类的可写接口和for
循环:主要区别在于
Select
* 不修改原始集合 *,而for
循环修改原始集合。我的观点是
Select
更干净,没有“作弊”-你只是在原来的集合上添加了一个投影。9rnv2umw2#
D Stanley回答正确。我想补充他的答案,因为标题是
Update item in IEnumerable
,意味着只有一个项目要更新。正如D Stanely在他的answer中所解释的:
Linq是用来查询的,不是用来更新的。
以及
使用IList等可写接口和for循环
要更新单个项,可以检索要更新的项的索引,并使用该索引更新该项。
例如:
yebdmbv43#
你的第一次尝试
返回一个新的
IEnumerable
,但不改变旧的。bbmckpt74#
试试这个:-
如果您不想将其存储在另一个变量中,请考虑使用
ToList()
。qybjjes15#
正如在现有答案中提到的,不能通过尝试为
IEnumerable
集合的一个元素赋新值来修改该集合。然而,如果集合中包含的元素是可变类型的,你可以修改它们,但是对于你的例子来说,这是不可能的,因为
string
是不可变的。因此,如果要修改
IEnumerable
中的现有元素,元素本身应该是支持修改操作的类型,如下面的示例所示。那么你可以这样使用它: