Я выполнял задание AoC на шестой день, когда заметил ошибку в своей программе.
В приведенном ниже коде при использовании List<string>
.Clear()
и в конце цикла у меня было 486 копий последних значений List<String>
. Я нашел исправление (взлом?), но я хочу знать, почему .Clear()
не работает на моем List<String>
. Полную программу можно найти здесь.
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>();
}
}
Clear()
не создает новый экземпляр, а Add()
не создает копию.
Таким образом, имея только buffer.Clear()
, блок else
добавлял ссылку на один и тот же экземпляр List в groups
на каждой итерации, которая также очищалась.
Да, ты прав. Другое решение:
groups.Add(buffer.ToList()); buffer.Clear()
поэтому вы «клонируете»List
перед добавлением его вgroups
. Обратите внимание, чтоbuffer.Clear();
в четвертой строке бесполезен.buffer
уже понятно. И радуйтесь, это довольно распространенная ошибка, которую я делаю раз в пару месяцев. Нечего стыдиться.