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