【问题标题】:Can't modify List inside an IEnumerable? [duplicate]无法修改 IEnumerable 中的列表? [复制]
【发布时间】:2016-11-23 12:45:53
【问题描述】:

我有一个IEnumerable<List<int>>,我想在它的一个列表中插入一个值。但我不能?
我在LinqPad中尝试了如下语句,但是插入后结果集不变:

var lists = new int[]{1,2,3}.Select(x => new List<int>{x});
lists.Dump();
lists.First().Insert(0, 5);
lists.Dump();

(我希望列表包含:{5, 1},但它仍然只包含 {1})

【问题讨论】:

  • 您的列表不是列表而是查询。每当您执行它时,它将生成三个列表,其中 single int 1,2 和 3。因此您不会得到包含三个 int 的单个列表。如果你想使用 Enumerable.Range(1, 3).ToList()new int[]{1,2,3}.ToList()
  • 自我回答的问题如果涵盖了以前未涉及的内容,则很好,并且积极鼓励您发布它们,但在这种情况下,基本问题之前已经问过,并且收到的答案至少和你自己的一样好。例如stackoverflow.com/questions/9104181/…
  • @hvd 所以在某些情况下可以发布问题并立即自己回答?
  • @Tim:啊,是的,我的命名很糟糕。我的意思是lists。我更新了我的代码。
  • @Protectorone 这些差异都不相关。它可以说,Foo 而不是listitem,或asdfklnasdfn,或ImARandomClass。序列中的实际项目实际上并不影响问题。如果有人最终找到了您的问题,而不是规范,那么当他们遇到此问题时,他们会看到它是重复的,转到规范,并得到一个很好的答案,因为 这是一个重复的问题。这就是我们将重复问题作为重复问题关闭的原因,以便找到这些重复问题的人可以找到规范答案。

标签: c# linq ienumerable generic-list


【解决方案1】:

是的,你不能! IEnumerable 每次评估时都会生成新的Lists;它就在您的代码中这么说:

.Select(x => new List<int>{x});

当您调用Dump() 时,它会被评估。当您调用First() 时,它会再次被评估。然后再次转储。所有新列表!

如果您在将 IEnumerable 放入 list 变量之前对其进行评估(例如,将其放入数组中),它将起作用:

var list = new int[]{1,2,3}.Select(x => new List<int>{x}).ToArray();
list.Dump();
list.First().Insert(0, 5);
list.Dump();

【讨论】:

  • yes.. 但没有得到 IEnumerable> linq 查询引用,如您的 OP 中所述
【解决方案2】:

正如 Tim Schmelter 在您的 OP 的第一条评论中所说,Linq IEnumerable 引用它是一个“查询”,即它是对一些静态方法(最终链接在它们之间)的一种引用,它得到一个 IEnumerable 对象(s)。

所以,您真正调用的是,它不是对象引用,而是作为 IEnumerable 对象的静态方法引用工作的东西。因此,每次在声明后使用 linq 引用时,您都会执行该静态方法在你的代码中。

因此,如果您在原始“查询”表达式中实例化一个对象,则无法使用查询获取的枚举对象的某些“状态更改”属性来修改其状态,您仅更改在该精确时间获取的值您执行该属性,但代码中“查询”引用的下一次调用将始终显示/详细说明原始表达式,因此将始终在查询表达式的声明中实例化相同的对象。

不管怎样,你可以试试这个:

var list = new int[]{1,2,3}.Select(x => new List<int>{x});
list = new int[]{5}.First().Concat(list);

通过这种方式,您可以使用一个查询重新分配相同的引用,该查询使用您想要的值来实例化一个新对象,将该值与原始引用查询获取的值相连接,因此您已经更改了在初始查询。

【讨论】:

    猜你喜欢
    • 2011-05-17
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多