1

私がList<OrderItem> orderItems取り組んでいる注文のバッチのデータベースからのすべてのアイテムを含む があります。またDictionary<int, Order> order_list、アイテムを入れる必要がある注文を含む もあります。Order オブジェクトには、List<OrderItem>OrderItems という名前のメンバーがあります。

order_list に ID が 1 の注文があります。OrderItems には、order_id が 1 で、3 つの異なる製品バリアント ID を持つ 3 つのアイテムがあります。

データベースからのフェッチでは、製品バリエーション 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 に答える