C# 列表<;T>;。Add()是否按顺序添加元素?

C# 列表<;T>;。Add()是否按顺序添加元素?,c#,list,insert,add,C#,List,Insert,Add,我有一个列表orderItems,其中包含我正在处理的一批订单的数据库中的所有项目。 我还有一个字典顺序\u列表,其中包含项目需要进入的顺序。 Order对象有一个名为OrderItems的列表成员 我在订单列表中有一个ID为1的订单。 我在OrderItems中有三个项目,其订单id为1,有三个不同的产品变体id 从数据库获取按产品变量id的顺序检索项目。这意味着orderItems的外观如下所示: [0]=>orderId=1,productVariantId=4[1]=>orderId=1

我有一个
列表orderItems
,其中包含我正在处理的一批订单的数据库中的所有项目。 我还有一个
字典顺序\u列表
,其中包含项目需要进入的顺序。 Order对象有一个名为OrderItems的
列表
成员

我在订单列表中有一个ID为1的订单。 我在OrderItems中有三个项目,其订单id为1,有三个不同的产品变体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);
    }
}
循环执行后,我发现order 1的OrderItems成员如下所示:

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

我仔细地浏览了代码,看着它插入元素。以下是我看到它所做的:

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

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

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

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

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

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

我的研究得出结论,这不应该是这样的,因为
List.Add()
方法应该总是将新元素添加到列表的末尾。
有人能告诉我为什么
List.Add()
在我的应用程序中没有按顺序添加元素吗?

我发现这个问题没有提供足够的代码。由于我无法发表评论,以下是我通过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;}
}
订单2的输出:

OrderId ProductVariantId 
2 10 
2 11 

现在,问题是什么?

文档的第一行写着“将对象添加到列表的末尾”,所以是的,顺序保持不变。与简单的列表操作相比,您的代码中有更多的内容,但是您的示例不够完整,无法告诉您错误所在。

查看.Insert()而不是add()Insert重载,您可以指定在何处插入。您确定
Order
类的
OrderItems
属性的类型是
List
List
没有
ContainsKey
方法,这让我相信
Order\u List
是一个
字典。你能证实吗?(这是这里的一个重要细节。)(注意,将真正的字典称为列表非常容易混淆。)还要确认键的类型,它是
int
,还是自定义类型?(我怀疑它是
int
)另外,请显示显示结果的代码。@user1886461
insert
不会改变这里的情况<代码>添加
总是将项目添加到列表的末尾,这是您想要的。显然,有相当多的重要信息您没有包括在内,您的问题很可能与任何
列表
无关。提供我所要求的信息将大大有助于我们有效地帮助您。事实上,我们还不清楚。@user1886461如果您在显示列表时没有正确地表示列表的实际内容,这将是最重要的。问题是,当我运行类似的代码时,第一个orderId的输出是:1 5
1 6
1 4
您可以发布您的缩写代码,以便我运行它吗?我尝试了一些不同的更改和打印选项,但我总是得到
14
15
16
。您可以在原始帖子下的讨论中找到所有这些。非常感谢您再次重复我在初始帖子中包含的一点。您可以随意忽略它,但它回答了“List.Add()没有按顺序添加元素吗?“我想提供更多帮助,但我担心这个问题目前没有更好的答案。我写道:“我的研究表明,这不应该是这样,因为List.add()方法应该始终将新元素添加到列表的末尾。”然后,我又提出了一个问题“有人能告诉我为什么List.Add()在我的应用程序中没有按顺序添加元素吗?”这个答案没有回答这个问题。
OrderId ProductVariantId 
2 10 
2 11