List <t> .Add()不按顺序添加元素?</t>

时间:2012-12-07 19:51:11

标签: c# list insert add

我有一个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()不会在我的应用程序中按顺序添加元素?

2 个答案:

答案 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;”,是的,维护订单。你的代码中除了简单的列表操作之外还有很多其他内容,但你的样本不够完整,无法告诉你错误是什么。