【问题标题】:Linq statement involving index based update of value not working涉及基于索引的值更新的 Linq 语句不起作用
【发布时间】:2017-01-27 01:13:21
【问题描述】:

在我的 C# winforms 项目中,我想更新集合中基于特定索引的位置(此处名为 List l1)。

我试过下面的代码:

l1.Where((s, i1) => i1 == intvalue).Select(s => { if (s > 0) s = -1; return s; };

我想在列表 l1 中将 invalue 索引处的值设置为 -1,但是当我使用上述语句执行此操作时,l1 中的值不会更改。请帮忙!我是 Linq 的新手,并且到处搜索主题“基于索引的集合中值的变化”,但无法解决我的问题,因为它涉及 BigInteger 类型,并且列表中有很多元素,它们的总数通过了允许c#中int类型的最大值。所以当我输入 l1[intvalue] 时,它说不能将 BigInteger 转换为 int 作为索引位置。

谢谢

【问题讨论】:

  • LINQ 是用来查询的,不是用来修改的。

标签: linq


【解决方案1】:

LINQ 是语言集成的查询。它的目的是查询数据。如果要修改列表项:

if (l1[intvalue] > 0)
    l1[intvalue] = -1;

另外我想解释一下为什么您的查询没有改变列表。

在第一步中,您正在按某些条件选择列表项。顺便说一句,情况很奇怪。如果要按索引选择项,有运算符ElementAt

然后你正在做投影。 IE。您正在调用匿名方法,该方法接受每个选定的项目并产生一些结果。每个项目作为s 参数传递给该方法。当您将 -1 分配给 s 时,您实际上是在为方法参数分配值。这不会影响列表中的项目。即使您的列表将包含引用类型的项目而不是整数,为方法参数赋值也只会改变参数变量指向的位置。它不会更改原始列表中的引用。尽管您仍然可以修改引用类型的项目。但是投影方法中的这种副作用并不是好的做法。

【讨论】:

  • 它说不能从 BigInteger 转换为 int 索引 intvalue 因为 'intvalue' 是 BigInteger。
  • @vinaych 为什么使用 BigInteger 作为列表中的索引?使用整数
  • 列表中的元素比 Int32.MaxValue 多,所以我需要访问那些额外的元素吗?
  • @vinaych 你有比 Int32.MaxValue 更多的元素?你为什么这么认为?
  • 我已经通过 collection.ToList() 方法添加了它们,并在 app.config 中将 gcallowverylargeobjects 设置为真值
猜你喜欢
  • 1970-01-01
  • 2021-05-30
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 2011-09-16
相关资源
最近更新 更多