字典mapItemTidsets
如下:
Dictionary<int, List<int>> mapItemTidsets = new Dictionary<int, List<int>>();
并且有以下键和值:
键 值
1 => 1,5,6
2 => 1,2,3,6,7
3 => 1,3,4,6
4 => 1,2,3,4,6,7
5 => 2,3,4,6,7
6 => 2,5,7
我想在多个键的比较中指定重复的值。
示例1:
键= 1,3 =>输出=(1,5,6)∩(1,3,4,6)= 1,6
示例2:
键= 2,4,5 =>输出=(1,2,3,6,7)∩(1,2,3,4,6,7)∩(2,3,4,6,7 )= 2,3,6,7
答案 0 :(得分:2)
您可以使用以下方法
IEnumerable<int> GetDuplicates(IDictionary<int, List<int>> dict, IEnumerable<int> keysToLook)
{
return dict.Keys
.Intersect(keysToLook)
.SelectMany(k => dict[k])
.GroupBy(i => i)
.Where(g => g.Count() == keysToLook.Count())
.Select(g => g.Key)
.ToArray();
}
通过指定的键组查找字典中的重复项。
测试以验证:
static void Tests()
{
var dict = new Dictionary<int, List<int>>()
{
{ 1, new[] { 1, 5, 6 }.ToList() },
{ 2, new[] { 1, 2, 3, 6, 7 }.ToList()},
{ 3, new[] { 1, 3, 4, 6 }.ToList()},
{ 4, new[] { 1, 2, 3, 4, 6, 7 }.ToList()},
{ 5, new[] { 2, 3, 4, 6, 7 }.ToList()},
{ 6, new[] { 2, 5, 7 }.ToList()}
};
var expected1 = new[] { 1, 6 };
var expected2 = new[] { 2, 3, 6, 7 };
var result1 = GetDuplicates(dict, new[] { 1, 3 });
var result2 = GetDuplicates(dict, new[] { 2, 4, 5 });
Console.WriteLine(expected1.SequenceEqual(result1));
Console.WriteLine(expected2.SequenceEqual(result2));
}
更新:结果也可以使用更简单的linq形式实现:
IEnumerable<int> GetDuplicates(IDictionary<int, IEnumerable<int>> dict, IEnumerable<int> keysToLook)
{
return dict.Keys
.Intersect(keysToLook)
.Select(k => dict[k])
.Aggregate((p, n) => p.Intersect(n));
}
其中字典具有更通用的专业化(值的类型表示为IEnumerable<T>
而不是List<T>
)。如果在字典中仍然需要List<T>
,则应修改聚合以显式地与List
一起使用:
.Aggregate((p, n) => p.Intersect(n).ToList())