У меня есть немного кода, над которым я работаю для друга в течение последних нескольких дней. На высоком уровне он анализирует текстовый файл и записывает в MDB. Короче говоря, у меня есть несколько вложенных циклов, выполняющих некоторую обработку элементов. Внутренний цикл вызывается только в определенных случаях, но когда он это делает, он делает некоторые странные вещи.
ArrayList CaseRecordItems = new ArrayList(); // this is created earlier
string baseTif = "sometext_"; // this is created earlier
CaseRecord cr = new CaseRecord(); (this gets populated with "stuff")
char increment = 'A';
for (int i = 0; i < FirstNames.Count; i++)
{
cr.Firstname = (string)FirstNames[i];
cr.Lastname = (string)LastNames[i];
if (FirstNames.Count > 1)
{
cr.Tif = baseTif + increment.ToString();
increment++;
}
CaseRecordItems.Add(cr);
}
Цикл выполняется, например, два раза и должен установить значение cr.Tif равным sometext_A и sometext_B. Это работает правильно, но как только второй элемент добавляется в коллекцию, значение первого изменяется в соответствии с ним.
Я подозреваю, что это из-за недостатка моего понимания того, как эти объекты создаются и распространяются. Любое понимание будет оценено.
EDIT:
На основании потрясающей обратной связи (и моего оцепенения) проблема была решена. Благодаря ответу Дэна я сделал несколько изменений в коде, который я пробовал, прежде чем использовать функцию клона (да, Бич, я действительно пробовал это: P).
Новый блок выглядит так:
ArrayList CaseRecordItems = new ArrayList (); // это создано ранее
string baseTif = "sometext_"; // это создано ранее
CaseRecord cr = new CaseRecord (); // это заполняется "материалом")
приращение символа = 'A';
for (int i = 0; i < FirstNames.Count; i++)
{
CaseRecord cr2 = new CaseRecord();
cr2 = cr.Clone(); // preserves the data from outside
cr2.Firstname = (string)FirstNames[i];
cr2.Lastname = (string)LastNames[i];
if (FirstNames.Count > 1)
{
cr2.Tif = baseTif + increment.ToString();
increment++;
}
CaseRecordItems.Add(cr2);
}
Спасибо всем за супер-быстрые ответы!