我有一个列表,其中我想要更新来自所有用户的事件标志,例如
userList:[
{'name':'a', isActive:'Y'},
{'name':'b', isActive:'N'},
{'name':'c', isActive:'Y'},
{'name':'d', isActive:'N'},
];
我想将 isActive 从 Y 更改为 N,从 N 更改为 Y,我的更新列表如下所示
userList:[
{'name':'a', isActive:'N'},
{'name':'b', isActive:'Y'},
{'name':'c', isActive:'N'},
{'name':'d', isActive:'Y'},
];
我怎样才能实现这个目标?
最佳答案
LINQ 代表语言集成查询 - 它是一种查询工具,而不是修改数据。 LINQ 查询不应该有副作用,例如“每次运行它时,它都会更改数据并给出不同的答案”。更改与正在查询的数据无关的其他数据也是一个副作用。
如果您想使用基于 lamdba 的方法永久更改列表中的项目,您可以在列表上使用 ForEach
- 这不是 LINQ 的东西;这是一个列表的东西:
myList.ForEach(item => item.isActive = (item.isActive == 'Y' ? 'N' : 'Y'));
..但这与 Matt Watson 在评论中发布的使用普通 foreach
的代码没有显着不同
如果您想每次都根据数据计算当前事件的倒数,那么使用 LINQ 就可以了:
myList.Select(item =>
new Item{
name = item.name,
isActive = (item.isActive == 'Y' ? 'N' : 'Y')
}
);
可以反复运行,输出稳定;如果 myList 数据未更改,则输出将是一个列表,其中包含在事件状态下翻转的项目
这是一个有副作用的 LINQ 查询;它每次运行时都会修改数组:
第一次,Select 执行了a[idx]++
,例如将数组索引 0 从 1 提高到 2,但 ++
操作返回增量之前的值,例如1(并且 a[0]
现在是 2)。这意味着您看到“原始数组”,即 1, 2, 3, 4
反射(reflect)在 >z1
结果,但 z2
是增加了一次(并且 a
充满了已经增加了两次的数字)
不要这样做;这会引起很多问题。 (我故意没有将代码作为文本放入,以阻止复制粘贴我们不应该编写的代码)
关于c# - 使用 linq C# 更新列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71250939/