【问题标题】:C# List Take by value instead of by referenceC# List 按值而不是按引用
【发布时间】:2020-04-15 14:39:21
【问题描述】:

我遇到了一个问题,如果我从字符串列表中“获取”,它会引用这些值,所以当我从原始列表中删除它们时,它们也会从我的“获取列表”中删除”。有没有办法从列表中获取值而不是引用?请参阅下面的代码。

// ids is a list of strings, use example: ["123","456","789"]
var chunkIds = ids.Take(10);

// right here, chunkIds = ["123","456","789"]

ids.RemoveRange(0, ids.Count < 10? ids.Count : 10);
// after remove the elements we just took from the original list, chunkIds = []
// I want chunkIds to be ["123","456","789"], and ids should be []

我在文档中没有看到任何方法(或者我是盲人): https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.take?view=netframework-4.8

【问题讨论】:

  • 添加ToList()。 Take是懒惰的。
  • @Caramiriel OMG *面对双手*。这绝对有效。如果您想将其添加为答案,我会接受。
  • 这能回答你的问题吗? IEnumerable Where() and ToList() - What do they really do? - 我将它标记为重复,不完全相同,因为它使用Where 而不是Take,但结果是相同的。不过我花了一段时间才找到一个好的副本。

标签: c# asp.net list linq


【解决方案1】:

Take 方法(与许多其他Linq 方法一样)正在使用延迟执行,您正在修改源序列。要使您的 sn-p 正常工作,您必须将 IEnumerable 转换为 ListArray(以获得新序列),就像这样

var chunkIds = ids.Take(10).ToList();
...

然后您将能够从chunkIds 中删除值,而不会影响源ids 序列

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多