Загрузка класса в виде списка

#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);
}
  

Это понятно?