1

我有一个List<OrderItem> orderItems包含数据库中我正在处理的一批订单的所有项目。我还有一个Dictionary<int, Order> order_list包含项目需要进入的订单。Order 对象有一个List<OrderItem>名为 OrderItems 的成员。

我在 order_list 中有一个 ID 为 1 的订单。我在 OrderItems 中有三个项目,它们带有 1 的 order_id 和三个不同的产品变体 id。

从数据库中获取按产品变体 ID 的顺序检索项目。这意味着 orderItems 看起来像这样:

[0] => orderId = 1,productVariantId = 4
[1] => orderId = 1,productVariantId = 5
[2] => 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] => orderId = 1,productVariantId = 5
[1] => orderId = 1,productVariantId = 6
[2] => orderId = 1,productVariantId = 4

我仔细浏览了代码,看着它插入了元素。这是我看到的:

产品变体 4 的迭代 1,最终的 OrderItems 如下所示:

[0] => orderId = 1,productVariantId = 4

产品变体 5 的迭代 2,最终的 OrderItems 如下所示:

[0] => orderId = 1,productVariantId = 5
[1] => orderId = 1,productVariantId = 4

产品变体 6 的迭代 3,最终的 OrderItems 如下所示:

[0] => orderId = 1,productVariantId = 5
[1] => orderId = 1,productVariantId = 6
[2] => orderId = 1,productVariantId = 4

我的研究使我得出结论,这不应该表现得如此,因为该List<T>.Add()方法应始终将新元素添加到列表的 END 中。谁能告诉我为什么List<T>.Add()没有在我的应用程序中按顺序添加元素?

4

2 回答 2

2

MSDN文档中的第一行说“将对象添加到 List<T> 的末尾”,所以是的,顺序保持不变。除了简单的列表操作之外,您的代码还有很多事情要做,但是您的示例还不够完整,无法告诉您错误是什么。

于 2012-12-10T16:17:39.600 回答
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 

现在,问题是什么?

于 2012-12-07T23:36:32.273 回答