我有一个List<OrderItem> orderItems
,其中包含我正在处理的一批订单的数据库中的所有项目。
我还有一个Dictionary<int, Order> order_list
,其中包含项目需要进入的订单。
Order对象有一个名为OrderItems的List<OrderItem>
成员。
我在order_list中有一个ID为1的订单。 我在OrderItems中有三个项目,它们的order_id为1,有三个不同的产品变体id。
从数据库中提取将按产品变体ID的顺序检索项目。这意味着orderItems看起来像这样:
[0] =&gt; orderId = 1,productVariantId = 4
[1] =&gt; orderId = 1, productVariantId = 5
[2] =&gt; orderId = 1,productVariantId = 6
在我的代码中,我有一个循环遍历orderItems并将它们分配给各自的订单:
foreach (OrderItem orderItem in orderItems)
{
if (order_list.ContainsKey(orderItem.OrderId))
{
order_list[orderItem.OrderId].OrderItems.Add(orderItem);
}
}
循环执行后,我发现订单1的OrderItems成员如下所示:
[0] =&gt; orderId = 1,productVariantId = 5
[1] =&gt; orderId = 1, productVariantId = 6
[2] =&gt; orderId = 1,productVariantId = 4
我仔细检查了代码,看着插入元素。这就是我所看到的:
产品变体4的迭代1,最终的OrderItems看起来像这样:
[0] =&gt; orderId = 1,productVariantId = 4
产品变体5的迭代2,最终的OrderItems看起来像这样:
[0] =&gt; orderId = 1,productVariantId = 5
[1] =&gt; orderId = 1, productVariantId = 4
产品变体6的迭代3,最终的OrderItems看起来像这样:
[0] =&gt; orderId = 1,productVariantId = 5
[1] =&gt; orderId = 1, productVariantId = 6
[2] =&gt; orderId = 1,productVariantId = 4
我的研究让我得出结论,这不应该是这样的,因为List<T>.Add()
方法应该始终将新元素添加到列表的END中。
谁能告诉我为什么List<T>.Add()
不会在我的应用程序中按顺序添加元素?
答案 0 :(得分:1)
我发现这个问题没有提供足够的代码。由于我无法评论,这是我的解释,通过LinqPad:
void Main()
{
//populate
var dbOrderItems = new List<OrderItem>();
dbOrderItems.Add(new OrderItem { OrderId = 1, ProductVariantId = 4 });
dbOrderItems.Add(new OrderItem { OrderId = 1, ProductVariantId = 5 });
dbOrderItems.Add(new OrderItem { OrderId = 1, ProductVariantId = 6 });
dbOrderItems.Add(new OrderItem { OrderId = 2, ProductVariantId = 10 });
dbOrderItems.Add(new OrderItem { OrderId = 2, ProductVariantId = 11 });
dbOrderItems.Dump();
Dictionary<int, Order> order_list = new Dictionary<int, Order>();
foreach(OrderItem orderItem in dbOrderItems)
{
if (order_list.ContainsKey(orderItem.OrderId))
{
var currOrderItems = order_list[orderItem.OrderId].OrderItems;
if (currOrderItems.Contains(orderItem) == false)
{
// order exists, add new order item
currOrderItems.Add(orderItem);
order_list[orderItem.OrderId].OrderItems = currOrderItems;
}
}
else
{
// new order
order_list.Add(orderItem.OrderId, new Order { OrderId = orderItem.OrderId, OrderItems = new List<OrderItem> { orderItem } });
}
}
order_list.Dump();
}
// Define other methods and classes here
public class OrderItem
{
public int OrderId {get;set;}
public int ProductVariantId {get;set;}
}
public class Order
{
public int OrderId {get;set;}
public List<OrderItem> OrderItems {get;set;}
}
订单1的输出:
OrderId ProductVariantId
1 4
1 5
1 6
订单2的输出:
OrderId ProductVariantId
2 10
2 11
现在,问题是什么?
答案 1 :(得分:1)
MSDN文档中的第一行显示“将对象添加到列表的末尾&lt; T&gt;”,是的,维护订单。你的代码中除了简单的列表操作之外还有很多其他内容,但你的样本不够完整,无法告诉你错误是什么。