【问题标题】:Loop through Object Initializer循环遍历对象初始化器
【发布时间】:2019-08-07 07:59:43
【问题描述】:

如何优化以下代码?

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

【问题讨论】:

  • 你能不能说得更具体些 - 出了什么问题以及你想做什么?
  • 我猜你想Add() 新的OrderItemOrderItemsList
  • 我正在尝试将数据库结果填充到对象初始化数组中,但它返回了 0 个结果。我已经检查了数据库查询,这很好。我需要为运行时文本模板填充这些对象。
  • while => OrderItemsList.Add(new OrderItem { ItemName = orderItemsResult.GetString("item_name"), Price = orderItemsResult.GetFloat("price"), Quantity = orderItemsResult.GetInt32("quantity") });中使用这个
  • 谢谢@er-sho 哈哈!我真是个菜鸟。

标签: c# object-initializers


【解决方案1】:

在接受的答案中,您可以将其实现为迭代器函数,但请记住,如果 orderedItemsResult 是 IDisposable (例如 IDataReader),用于从数据库之类的内容中读取(在其上调用的方法似乎是case) 以确保将其嵌入到 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();
    }
}

实现 IDisposable 的返回的 IEnumerable 也执行 finally 块,只要它被释放(例如,当一个 foreach 完成时)

【讨论】:

    【解决方案2】:

    虽然回复有点晚了,但我还是会补充一下我的想法。 我们可以不用List&lt;OrderItem&gt; 对象。 下面的代码返回IEnumerable&lt;OrderItem&gt;

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

    【讨论】:

    • 谢谢阿吉特!非常感激。我从没想过有很多方法可以做到这一点。对像我这样的一周老 c# 开发人员有很大帮助。
    【解决方案3】:

    正如@crowcoder 和@er-sho 在cmets 中指出的那样,您需要将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);
    }
    

    【讨论】:

    • 谢谢!非常感谢。
    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 2020-04-30
    • 2017-06-12
    • 2015-10-31
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多