遍历对象初始化器

Loop through Object Initializer

如何优化以下代码?

IList<OrderItem> OrderItemsList = new List<OrderItem>();
while (orderItemsResult.Read())
{
    new OrderItem()
    {
        ItemName = orderItemsResult.GetString("item_name"),
        Price = orderItemsResult.GetFloat("price"),
        Quantity = orderItemsResult.GetInt32("quantity")
    },
}

正如@crowcoder 和@er-sho 在评论中指出的那样,您需要将 OrderItem 添加到 OrderItemsList:

IList<OrderItem> OrderItemsList = new List<OrderItem>();
while (orderItemsResult.Read())
{
    var orderItem = new OrderItem()
    {
        ItemName = orderItemsResult.GetString("item_name"),
        Price = orderItemsResult.GetFloat("price"),
        Quantity = orderItemsResult.GetInt32("quantity")
    };

    // add to the list
    OrderItemsList.Add(orderItem);
}

虽然回复晚了点,还是补充一下我的想法。 我们可以不用 List<OrderItem> 对象。 下面的代码returnsIEnumerable<OrderItem>

while (orderItemsResult.Read())
{
   yield return new OrderItem()
   {
        ItemName = orderItemsResult.GetString("item_name"),
        Price = orderItemsResult.GetFloat("price"),
        Quantity = orderItemsResult.GetInt32("quantity")
    };
}

与接受的答案一样,您可以将其实现为迭代器函数,但请记住,如果 orderedItemsResult 是一个 IDisposable,例如 IDataReader,用于从数据库之类的东西中读取(调用它的方法似乎是这个是这种情况)以确保将其嵌入 try/finally 或 using 块中。 例如:

IEnumerable<OrderItem> GetOrders(string connectionString, string queryString)
{
    IDbConnection connection = new MyDbConnection(connectionString);
    IDbCommand command = null;
    IDbReader orderedItemsResult = null;
    try
    {
        connection.Open();
        command = new MyCommand(queryString, connection);
        orderedItemsResult = command.ExecuteReader();
        while (orderItemsResult.Read())
        {
            yield return new OrderItem()
            {
                ItemName = orderItemsResult.GetString("item_name"),
                Price = orderItemsResult.GetFloat("price"),
                Quantity = orderItemsResult.GetInt32("quantity")
            };
        }
    }
    finally
    {
        orderItemsResult?.Dispose();
        command?.Dispose();
        connection.Dispose();
    }
}

返回的 IEnumerable 实现了 IDisposable 并在处理时执行 finally 块(例如,当 foreach 完成时)