为了比较两者List<String>
并提取它们之间的差异,我使用了Linq's Except
。
即:
说我想使用Linq比较以下两个列表的相等性:
List1 = "0,1,2,2,3"
List2 = "0,1,2,3"
List<string> differences1 = List1.Except(List2).ToList();
List<string> differences2 = List2.Except(List1).ToList();
differences1
并且两个列表中differences2
都没有项目2
,但是两个列表不相等。我希望能够提取列表之间的所有差异,包括一个重复的信息,而另一个则没有。
提取两个List<string>
对象之间所有差异的最佳方法是什么?
因此,您要寻找的是一种Except
适用于手提袋而不是套装的背包。因此,如果一个序列具有一个项目的2个副本,而您将一个副本减去一个副本集,则应该只剩下一个副本,而不是像执行减法操作一样,先将所有序列简化为不同的集合Except
。
这使它的处理起来不太优雅,但是仍然不可怕。无需使用aHashSet
来代表另一个集合中的项目,您只需要有一个字典即可将项目映射到副本数。然后,对于每个项目,如果它在字典中,请从计数中删除一个,并且不产生它;如果它不在字典中,则应产生它。
public static IEnumerable<T> BagDifference<T>(IEnumerable<T> first
, IEnumerable<T> second)
{
var dictionary = second.GroupBy(x => x)
.ToDictionary(group => group.Key, group => group.Count());
foreach (var item in first)
{
int count;
if (dictionary.TryGetValue(item, out count))
{
if (count - 1 == 0)
dictionary.Remove(item);
else
dictionary[item] = count - 1;
}
else
yield return item;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句