使用 linq C# 更新列表

updating a list using linq C#

我有一个列表,其中我想更新的是来自所有用户的活动标志

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 代表 Language Integrated Query - 它是一种用于查询而非修改数据的工具。 LINQ 查询不应有副作用,例如“每次 运行 它都会更改数据并给出不同的答案”。更改与被查询数据无关的其他数据也是一个副作用..

如果您想使用基于 lamdba 的方法永久更改列表中的项目,您可以在列表上使用 ForEach - 这不是 LINQ 的东西;这是一个列表的东西:

myList.ForEach(item => item.isActive = (item.isActive == 'Y' ? 'N' : 'Y'));

..但这与 Matt Watson 在评论中发布的代码没有显着差异,使用正常的 foreach


如果你想calculate-every-time-from-the-data当前活动的倒数,用LINQ就可以了:

myList.Select(item => 
  new Item{ 
    name = item.name, 
    isActive = (item.isActive == 'Y' ? 'N' : 'Y')
  }
);

你可以运行一遍又一遍,输出稳定;如果 myList 数据未更改,则此输出将是一个列表,其中包含处于活动状态的项目


这是一个有副作用的 LINQ 查询;它每次修改数组 运行s:

第一次,Select 做了 a[idx]++,例如将数组索引 0 从 1 增加到 2,但是 ++ 操作 returns 增量之前的值,例如1(a[0] 现在是 2)。这意味着您看到“原始数组”,即 1, 2, 3, 4 反映在 z1 结果中,但是 z2 是向上的一次(并且 a 充满了被撞了两次的数字)

不要这样做;它会引起很多问题。 (我故意没有把代码放在文本中,以阻止copy-pasting我们不应该写的代码)