2011-07-01 12 views
0

は、だから私は、リスト内の辞書項目のコレクション:C#List <>から重複する辞書項目を削除しますか?

List<Dictionary<string, string>> inputData = new List<Dictionary<string, string>>(inputs);  
List<Dictionary<string, string>> itemStack = new List<Dictionary<string, string>>(); 

は今、私が何をしたいのか、私はitemStackはすでに同じ値(辞書項目)を持っているかどうかを確認したい各引数inputData辞書項目のためです。

私はそれが似ていると思っていましたか?

foreach (var item in inputData) 
{ 
    if(!itemStack.Contains(item){ itemStack.Add(item)} 
    else{ //Duplicate found} 
} 

実際に項目の値はチェックされていませんか?それはそれがそれを持っていないと仮定します... 私が欲しいのは、itemStackが含まれていて、すでにスタックに入っているアイテムにそれが含まれていない場合だけです。 私は何かが明らかでないことを知っています。 ありがとう、

+2

辞書<文字列、文字列>が足りない?辞書のリストを作るのはなぜ<文字列、文字列>の方法は、ASPに、この関連している? –

+0

.NET? –

+0

@トマス私は、各項目を繰り返してチェックしていますか? @Timというのは、このサイトのasp.netコントローラのイベントのためです。投稿結果を削除し、重複したエントリを削除しようとしています。 – Vinny

答えて

0

これはかなり完全な答えではありませんが、それは私がしたものです。それはそれを見ていたときにそう

if(!String.IsNullOrEmpty(item["itemId"])) 
{ 
    alert.DaleksApproaching(item["itemId"]); 
} 

だから私はアイテムのリストを持っており、代わりにフルを行うには、一覧で(したがって、他は考えられ)私は1つだけのアイテムのチェックをしたいただきました!と比較しますそれを取り除くための別のイベントを実行するだけの価値があります。 LINQを使用するという考え方は、私が好きな(Contains and Distinct)についてアプローチしています。私はまだそれを試みているが、私はそれを行うことを計画している。このためには、LINQを:(使用していない

おかげでみんな!

1

ディクショナリは参照型なので、期待どおりの "ディープ"値はチェックされません。 、HashSetのが良いだろうという

if(!MyContains(itemStack, item)){ itemStack.Add(item)} 
+0

+1:2つの辞書のデフォルトの「等しい」チェックでは、2つのオブジェクトがまったく同じかどうか(メモリ内の同じ場所を占めるかどうか)をチェックするだけです。 – StriplingWarrior

0

真:

あなたは辞書のように完全に分離する方法や拡張自体はその後、例えば、代わりにそれを使用するか、独自の「入って」メソッドを記述する必要がありますしかし、あなたはここでそれを行いたい場合は、(あなたが唯一の重複キーをフィルタリングしていると仮定して)これを試してみてください。

foreach (var item in inputData.Keys) 
{ 
    if (itemStack.Where(x => x.Key == item.Key).Count() > 0) 
       // There was a duplicate 
} 

それとも、あなただけのデータが出ているときに呼び出すことができます気にしている場合:

0

あなたのやり方は正しいと思います。私の考えでは、HashSetは良いですが、新しい要素を追加すると、同じ項目の内容について同じテストが実行されます。

よろしくお願いいたします。

0

あなたの最初の問題の声明に基づいて、あなたはこのような何か行う可能性があります:あなただけ、あなたはitemStackに存在するキーをスキップするようにこれを行うことが2つの辞書を結合する必要がある場合は

var aggregateKnownKeys = itemStack.SelectMany(d => d.Keys); 
itemStack.AddRange(
    inputData.Select(d=> d.Where(p => !aggregateKnownKeys.Contains(p.Key)) 
          .ToDictionary(p => p.Key, p => p.Value))); 

は:

var inputData = new Dictionary<string, string>(); 
var itemStack = new Dictionary<string, string>(); 

var oldStack = itemStack; 
itemStack = new[] { inputData.SkipWhile(d => oldStack.Keys.Contains(d.Key)), itemStack } 
    .SelectMany(d => d) 
    .ToDictionary(d => d.Key, d => d.Value); 
関連する問題