【发布时间】:2021-04-04 02:49:54
【问题描述】:
当我发现我的程序中存在错误时,我正在做 AoC 第六天的挑战。
在下面的代码中,当使用 List<string>.Clear() 和循环结束时,我有 486 个最后一个 List<String> 值的副本。我找到了一个修复(hack?)但我想知道为什么.Clear() 不能在我的List<String> 上工作。完整程序可以找到here.
int result = 0;
List<List<string>> groups = new List<List<string>>();
List<string> buffer = new List<string>();
buffer.Clear();
foreach (string s in lineList)
{
if (!string.IsNullOrEmpty(s))
{
buffer.Add(s);
}
else
{
groups.Add(buffer);
//// old way
//// was getting 487 copies of the last group
// buffer.Clear
// new way, works but I don't understand why
// byref vs byval issue?
buffer = new List<string>();
}
}
【问题讨论】:
-
是的,你是对的。另一个解决方案是:
groups.Add(buffer.ToList()); buffer.Clear(),所以你先“克隆”List,然后再将其添加到groups。请注意,第四行中的buffer.Clear();是无用的。buffer已经很清楚了。并且要高兴,这是我每隔几个月就会犯的一个很常见的错误。没什么好羞愧的。
标签: c# list .net-core pass-by-reference