#c# #list
#c# #Список
Вопрос:
У меня есть класс
public class Orders
{
public Orders() {}
private string _idOrder;
private string _totalPrice;
public string idOrder
{
get{ return _idOrder;}
set { _idOrder = value;}
}
public string totalPrice
{
get { return _totalPrice; }
set { _totalPrice = value; }
}
}
Я загружаю список из базы данных следующим образом
while (dr.Read())
{
Orders.idOrder = dr["IdOrder"].ToString();
Orders.totalPrice= dr["totalPrice"].ToString();
}
Он показывает мне только последнюю запись. Как я могу загрузить все заказы и получить их обратно с помощью цикла foreach?
Комментарии:
1. @Marc Gravell Я не знаю, как создать список в таком типе сценария. Я новичок 🙂
2. yield return просто соберите ваши значения и верните их в виде списка. После выхода элемент управления возвратом не будет выходить из функции
3. Если вам не нужен список заказов более одного раза, вам лучше использовать способ @Grook. И если они вам нужны, вам лучше использовать способ @»Daniel Hilgarth».
Ответ №1:
Создайте список 🙂
List<Order> orders = new List<Order>();
while (dr.Read())
{
Order order = new Order();
order.idOrder = dr["IdOrder"].ToString();
order.totalPrice= dr["totalPrice"].ToString();
orders.Add(order);
}
Как вы видите, я переименовал ваш класс из Orders
в Order
, потому что это то, что он действительно представляет: один порядок. Чтобы иметь больше заказов, вам нужно поместить эти отдельные заказы в список.
Комментарии:
1. За исключением того, что ваш класс не будет компилироваться 😉
Ответ №2:
Он показывает вам только один элемент, потому что вы меняете свойства только одного элемента, а не создаете экземпляр нового:
var results = new List<Order>();
while (reader.Read())
{
var order = new Order
{
Id = (int)reader["IdOrder"],
TotalPrice = (decimal)reader["totalPrice"]
};
results.Add(order);
}
Комментарии:
1. Увы, но idOrder и TotalPrice являются строками
2. Совершенно верно, но я думаю, что ему также необходимо учитывать корпус типа, соглашения об именовании элементов и правильное использование типа 😉
3. @Rakshit, я думаю, у Мэтта здесь есть пара хороших моментов. Сохранение целого идентификатора (если это целочисленное значение?) в строковом поле просто неэффективен ole…. А хранить цену (любую денежную сумму) в строковом поле просто НЕПРАВИЛЬНО! Одна вещь, которую компьютер делает МНОГО, — это суммирование денег… так разве цена не должна храниться в виде числа? И
decimal
является хорошим выбором для денежных значений, потому что вычисления с десятичными дробями дают точные (или максимально предсказуемые) результаты.
Ответ №3:
Я думаю, вы ищете что-то вроде этого:
IEnumberable<Order> FetchOrders()
{
while(dr.Read())
yield return new Order {
idOrder=dr["IdOrder"].ToString(),
totalPrice=dr["totalPrice"].ToString()
});
}
Комментарии:
1. Он думает, что ваш ответ близок к тому, что он или она хочет. 1
2. @Grook Меня немного смущает оператор yield return
3. @Grook: Я думаю, ваш ответ слишком сложен для новичка. (без голосования).
4. @Grook: Я бы никогда не подумал о том, чтобы выставлять его как IEnumerable … это на самом деле довольно аккуратно (особенно с точки зрения памяти)… предполагается, что для ФАКТИЧЕСКОЙ обработки требуется всего ОДНА итерация только для пересылки… и если список действительно требуется, то создать его из перечисления — это дочерняя игра. Мне это нравится. Спасибо рыбе. Приветствия. Кит.
5. @Chris: Вы можете прочитать больше об этом здесь @DanielHilgarth: Для новичка это просто полезный и удобный способ решить эту проблему. И, может быть, он (она) прочитает об этом и освоит эту технику.
Ответ №4:
Этот Orders
класс представляет единый порядок! Если вам нужен список заказов, то я предлагаю вам переименовать этот класс в Order, а затем создать List<Order>
(список объектов order) и заполнить его из результатов вашего запроса.
Также (простите меня за придирчивость) «idOrder» не является подходящим именем поля. Стандартными подходами являются «OrderID» или просто старый «Id» (идентификатор или даже id). Аналогично, я бы ожидал, что цена ОДНОГО заказа будет называться просто «сумма» или даже «цена»… не «TotalPrice»… это будет слишком запутанно, когда вы перейдете к подсчету общих цен… улавливаете мой намек?
Приветствия. Кит.
Комментарии:
1. Я Ваааааю слишком медленно! Должно быть, устарел! 😉
2. 1 за описание. Мне действительно нужно понять как новичку.
Ответ №5:
Я не понимаю, как это будет компилироваться. Orders.idOrder — это не статическое свойство, это свойство экземпляра.
Комментарии:
1. Он компилируется правильно, и я тоже получаю выходные данные. Я делаю что-нибудь неправильно? Посоветуйте мне, чтобы я мог исправить логику
2. Как вы можете установить Orders.idOrder, когда idOrder (и его вспомогательный элемент) не объявлен статическим?
Ответ №6:
Если я правильно вас понимаю, вы хотите использовать что-то вроде этого:
List<Order> = new List<Order>();
while (dr.Read())
{
Order newOrder = new Order();
newOrder.idOrder = dr["IdOrder"].ToString();
newOrder.totalPrice= dr["totalPrice"].ToString();
orderList.Add(newOrder);
}
Ответ №7:
Обратите внимание, что я просто обсуждаю больше для ответа @Grook. Я думаю, что это так близко к тому, что нужно хотеть.
IEnumberable<Order> FetchOrders()
{
while(dr.Read())
yield return new Order {
idOrder=dr["IdOrder"].ToString(),
totalPrice=dr["totalPrice"].ToString()
});
}
Затем вы можете легко использовать цикл foreach
Foreach(Order order in GetOrders())
{
doSomething(order);
}
Это понятно?