2011-07-01 198 views
0

所以我在列表字典項的集合:C#從列表<>中刪除重複的字典項?

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

詞典<字符串,字符串>是不夠的?爲什麼讓字典的名單<字符串,字符串>? –

+0

在其方式是這涉及到ASP .NET? –

+0

@Tomas我正在遍歷每個項目,以檢查它的重複 @Tim只是因爲它在本網站上的asp.net控制器的事件。我在清理帖子結果並嘗試刪除重複條目。 – Vinny

回答

0

好吧,這不是一個完整的答案,但這是我所做的。

所以我有一個項目的名單,並與其做一個完整的比較,什麼在列表(因此,其他的考慮),我只是做了一個項目檢查:

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

所以當它看到它有一個價值,它只是做另一個事件擺脫它。 使用LINQ和方法的想法(包含和獨特)我喜歡。我還沒有嘗試過,但我打算這麼做。爲此,它不使用LINQ :(

謝謝大家!

1

字典是引用類型,所以它不會檢查像您期望的「深」值。

您必須編寫自己的「包含」方法,無論是作爲完全獨立的字典的方法或擴展,然後自己用它來代替,例如:

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

+1:兩個字典的默認「Equals」檢查將檢查兩個對象是否完全相同(即佔用內存中的相同位置)。 – StriplingWarrior

0

誠然,HashSet的效果會更好,但如果你想在這裏做,試試這個(假設你只過濾重複鍵):

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

或者,如果你只當數據出來關心你可以撥打:

itemStack.Distinct() 
0

我想,你的方法是對的。在我看來,HashSet是好的,但是當你添加一個新的元素時,它會對相同項目的內容執行相同的測試。

問候。

0

根據您最初的問題發言,你可能會做這樣的事情:

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))); 

如果你只需要兩個庫結合起來,那麼你可以這樣做是爲了跳過存在於itemStack鍵:

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);