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