c# - 使用 linq C# 更新列表

标签 c# linq

我有一个列表,其中我想要更新来自所有用户的事件标志,例如

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 查询;它每次运行时都会修改数组:

enter image description here

第一次,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/

相关文章:

asp.net-mvc - LINQ Distinct()

c# - 如何剪切字符串的第一部分并存储它

带有枚举数组的 C# 反射

linq - 如何在 lambda 表达式中调用方法?

c# - 如何使用 linq 对集合对象执行 WHERE(使用 Netflix 数据源)

c# - LINQ OrderBy 自定义订单

c# - Leetcode测试链表

c# - 用于根据条件编写标签的 Razor 语法

c# - 将 DisplayFor 与嵌套属性的单个索引一起使用 - Lambda 参数不在范围内

c# - LINQ:从另一个 IEnumerable<T> 创建 IEnumerable<T>?