遍历对象初始化器
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 完成时)
如何优化以下代码?
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 完成时)