Извините, если я пытаюсь правильно это сформулировать. ООП - это не мой опыт, но я очень стараюсь учиться.Создайте экземпляр объекта каждый n-й раз через цикл
Как создать экземпляр объекта, скажем, каждую третью итерацию цикла?
Внутри цикла мне нужно назначить значения объекту, но свойство назначать значение будет зависеть от результата оператора case. Как только каждое свойство объекта было назначено, мне нужно добавить этот объект в список объектов того же типа.
Если я создаю объект до ввода цикла, то мой список снова и снова содержит один и тот же результат, потому что (я читал), что список содержит только ссылку на объект, а если объект затем изменяется, так же как и список.
Если я создаю объект в цикле, то, очевидно, каждый раз я получаю новый объект только с одним из назначенных ему свойств к моменту добавления его в список. Список будет содержать разные результаты, но будет назначено только последнее свойство, так как каждый новый объект создается.
То, что я предположил, что вы могли бы сделать это, - это создать новый объект, когда все свойства имеют назначенное ему значение (или в начале, когда оно не было). Таким образом, поскольку у моего объекта есть три свойства, каждый раз через цикл, я хотел бы добавить новый объект всякий раз, когда int iCounter был равен 0, добавлял значения и увеличивал iCounter, тогда, когда iCounter равен 3, установлено значение 0. Однако, когда я пытаюсь создать объект внутри оператора if, остальная часть программы не видит, что объект существует.
Я также предположил, что я мог бы попробовать какую-то макроподстановку, которая, как я обычно, прибегает к Фоксу, я читал, что это большой нет-нет в C#.
Любые идеи?
try
{
cProducts Product = new cProducts();
SqlConn2.Open();
rdr2 = SqlComm2.ExecuteReader();
int iScanLine = 0;
while (rdr2.Read())
{
iScanLine++;
Product.product = rdr2["product"].ToString();
Product.sOrder = rdr2["order_id"].ToString();
switch (rdr2["detail"].ToString())
{
case "Quantity":
Product.quantity = Convert.ToInt16(rdr2["display_value"]) ;
break;
case "Option":
Product.Option = rdr2["display_value"].ToString();
break;
case "Size":
Product.Size = rdr2["display_value"].ToString();
break;
}
if (iScanLine == 3)
{
lProducts.Add(Product);
thisPage.sProducts.Add(lProducts[lProducts.Count() - 1]);
iScanLine = 0;
}
}
}
Оператор '%' (модуль) дает остаток от целочисленного деления. Таким образом, если 'n% 3 == 0', то n делится на 3. – spender
Обратите внимание, что это фактически очень мало связано с объектно-ориентированным программированием как таковым. То, что вы действительно задаете, - «как я могу что-то делать каждые X итераций цикла»? Тот факт, что «делать что-то» в этом случае «создает экземпляр нового объекта», является полностью вспомогательным. – David
Возможно, вы хотите пересмотреть SQL-запрос, возвращающий данные, чтобы исправить вашу проблему в первую очередь? Похоже, вы можете изменить запрос, чтобы вернуть одну строку за элемент. – Gene