0

.NET Winfroms C# アプリには、listItems という名前の Dictionary コレクションがあります。アプリの起動時にデータを保存します。静的クラスでは、次のようにしています。

    // listItems is populated bt reading a file. 
    // No other operations are performed on it, except finding an item.
    public static Dictionary<string, RefItemDetails> itemsList;

   // Find RefItemDetails of barcode
    public static RefItemDetails FindRefItem(string barcode)
    {
        RefItemDetails itemDet = null;
        try
        {
            //if (itemsList.TryGetValue(barcode, out itemDet) == false)
            //    System.Diagnostics.Debug.WriteLine("Barcode " + barcode + " not found in Items");

            //itemDet = itemsList.First(item => item.Key == barcode);//.First(item => item.Barcode == barcode);

            if (itemsList.ContainsKey(barcode) ) 
                itemDet = itemsList[barcode];
        }
        catch (Exception)
        {
            itemDet = null;
        }

        return itemDet;
    }

別のクラスの listItems からアイテムを取得するには、次を使用します。

    refScannedItem = null;
    // Get Unit Barcode & Search RefItem of it
    refScannedItem = UtilityLibrary.FindRefItem(boxItem.UnitBarcode.Trim());

     // Display BOX item details 
     refScannedItem.Barcode = boxItem.BoxBarcode.Trim();
     refScannedItem.Description = "BOX of " + boxItem.Quantity + " " + refScannedItem.Description;
     refScannedItem.Retail *= boxItem.Quantity;
     refScannedItem.CurrentCost *= boxItem.Quantity;

ここで、上で何が起こるかというと、アイテムを検索して取得し、「refScannedItem」によってその説明を追加します"BOX of " + boxItem.Quantity + " " + refScannedItem.Description;。なので本来の説明が「アクアフィナ」だったら「アクアフィナ10個入りBOX」にします。次に同じ商品をスキャンしたところ、商品が見つかりましたが、その説明が「10 アクアフィナのボックス」になっているため、私の設定の説明の行は「10 アクアフィナの 10 BOX のボックス」になります。「アクアフィナ 10BOX 10BOX 10BOX」などと同様です。

私の検索コードでわかるように、最初は を使用TryGetValueし、次に を使用しLINQ、次に を使用しContainsKeyましたが、それらすべてで listItem の値が更新されるのはなぜですか。

TryGetValueasがパラメータであることは理解していoutますので、値は として渡され、referenceその後変更されます。しかし、listItems[key]それも更新します!!! どうすればこれを回避できますか? Dictionary簡単で高速な検索のためにコレクションを選択しましたが、この部分は多くの問題を引き起こし、アプリにも大きなバグが発生します。値を受け取るが更新してはならない解決策が見つかりませんでした。すべての記事は、それを検索して更新する方法を示しています。

上記の解決策を教えてください。どんな助けでも大歓迎です。

ありがとう

4

5 に答える 5

1

あなたはこれについて間違った方法で進んでいると思います。

Description数量が変化するたびに更新する書き込み可能なプロパティを持つべきではありません。

Name代わりに、アイテムの名前 (Aquafina など) を含む別のプロパティと、次のDescriptionように動的に作成される読み取り専用プロパティを用意する必要があると思います。

public string Description
{
    get
    {
        return string.Format("Box of {0} {1}", Quantity, Name);
    }
}

または、同様の線に沿った何か。

于 2015-04-21T13:07:52.720 に答える
0

これでうまくいくはずです:

if (!refScannedItem.Description.StartsWith("BOX of "))
{
    refScannedItem.Description = "BOX of " + boxItem.Quantity + " " + refScannedItem.Description;
}
于 2015-04-21T13:00:08.000 に答える