Добавление новых объектов в словарь во время итерации по циклу?

#c# #loops #dictionary #while-loop

#c# #циклы #словарь #во время цикла

Вопрос:

Я пытался добавлять объекты с определенными свойствами в Dictionary<int, DwgObject> словарь в цикле while, просматривая значения в столбце excel. Кажется, даже если я объявляю новый объект в своем цикле, свойства моих соответствующих объектов в конечном итоге остаются одинаковыми во всем словаре. Вот цикл while, который я использую:

 Dictionary<int, DrawingObj> lst = new Dictionary<int, DrawingObj>(); 
int numRows = 0;

//Loop through Drawing Number column -> Add new obj to list with drawing number prop
//Iterate to next row down -> check for empty string to break loop 
string current = wks.Cells[row, column]?.Value2?.ToString() ?? "";
while ((current != ""))
 {
     DrawingObj newDWG = new DrawingObj();
     newDWG.dwgNumber = current; 
     lst.Add(numRows, newDWG);
     numRows  ;
     current = wks.Cells[(row   numRows), column].Text;
  }
  

Результирующий словарь дает мне 13 записей объектов со свойством dwgNumber, равным строке моего последнего значения Excel. Как я могу сохранить уникальные значения свойств для пары ключ-значение?

Обновление: я попытался изменить цикл, чтобы извлекать свойства каждого объекта в виде одной строки и сохранять в массив, а затем позже, используя цикл, создать экземпляр объекта со всеми свойствами сразу. Но это приводит к той же ошибке. Смотрите ниже:

 //store string of all properties with delimiter '|'
while ((current != ""))
{
    StringBuilder properties = new StringBuilder();
    for(int i = 0; i < 7; i  )
    {
       properties.Append(wks.Cells[(row   numRows), propColIndex[i]].Text);
       if(i != propColIndex.Length - 1) { properties.Append("|"); }
    }
    propStrings.Add(properties.ToString());
    numRows  ;
    current = wks.Cells[(row   numRows), column].Text;
}

//for each property string create new object w/ props -> add object to dictionary foreach (var props in propStrings) // t i = 1; i <= numRows-1; i  )
{
    percent = (j / numRows) * 60;
    int k = 0;
    string[] values = new string[8];

    foreach (string prop in props.Split(delimiter))
    {
       values[k] = prop;
       k  ;
    }
    DrawingObj newDWG = new DrawingObj()
    {
                    dwgNumber = values[0],
                    sheetNo = values[1],
                    revNo = values[2],
                    keyWord = values[3],
                    dwgType = values[4],
                    descSublocation = values[5],
                    revType = values[6],
                    fileName=values[7],
                    facilityLoc = constFacilFields[0],
                    facilityType = constFacilFields[1],
                    jobOrderNum = constFacilFields[2]
     };
     lst.Add(j-1, newDWG);
     j  ;
  

Комментарии:

1. Ваша проблема в том, что string это ссылочный тип, поэтому у вас на самом деле есть 13 экземпляров DrawingObj , но все они указывают на одну и ту же строку ( current ) .

2. А, понятно. Решит ли это проблему создание нового экземпляра string в моем цикле, ссылающегося на текущую каждую итерацию, или это все равно будет иметь тот же результат?

3. @HansKilian Они указывают на одну и ту же строку только в том случае, если текст ячейки листа является одной и той же строковой ссылкой для каждого из объектов. Он не вел бы себя иначе, если бы это был тип значения, учитывая, что значение никогда не изменяется.

4. Попробуйте не использовать current и назначить содержимое ячейки напрямую. Что-то вроде newDWG.dwgNumber = wks.Cells[(row numRows), column].Text;

5. @HansKilian Я попробовал это и получил тот же результат