C#从List<&gt ;?中删除重复的字典项

时间:2011-07-01 20:20:29

标签: c# dictionary

所以我列表中的字典项集合:

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

现在我要做的是每个inputData字典项我想检查itemStack是否具有相同的值(字典项)。

我在想它会是什么样的?

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

它没有真正检查里面的项目值?它只是假设它没有它...... 我想要的只是如果itemStack包含,并且堆栈中已有的项目不包含它。 我知道我错过了一些明显的东西。 谢谢,

5 个答案:

答案 0 :(得分:1)

Dictionary是引用类型,因此它不会像您预期的那样检查“深度”值。

您必须编写自己的“包含”方法,作为完全独立的方法或字典本身的扩展,然后使用它,例如:

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

答案 1 :(得分:0)

确实HashSet会更好,但如果您想在此处执行此操作,请尝试此操作(假设您仅过滤重复的键):

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

或者,如果你只关心数据何时出来,你可以致电:

itemStack.Distinct()

答案 2 :(得分:0)

我认为,你的方式是正确的。在我看来,HashSet很好,但是当你添加一个新元素时,它会对相同项目的内容执行相同的测试。

问候。

答案 3 :(得分: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);

答案 4 :(得分:0)

好的,所以这不是一个完整的答案,但这就是我所做的。

所以我有一个项目列表,而不是完全比较列表中的什么(因此另一个考虑)我只做了一个项目检查:

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

所以,当它确实看到它有一个值时,它只是做另一个事件来摆脱它。 使用LINQ的想法和方法接近(包含和区别)我喜欢。我还没试过,但我打算这样做。为此,它不使用LINQ :(

谢谢大家!