2011-07-01 183 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);