我有一个dictionary<int, List<string>>
,我希望与每个int的所有列表相交。
我将如何实现这一目标?我觉得这应该很容易,但由于某些原因它不能解决。
感谢。
答案 0 :(得分:6)
迭代列表序列很简单,将第一个放入HashSet
,然后将每个子序列列表与它相交:
public static IEnumerable<T> intersectAll<T>(IEnumerable<IEnumerable<T>> source)
{
using (var iterator = source.GetEnumerator())
{
if (!iterator.MoveNext())
return Enumerable.Empty<T>();
var set = new HashSet<T>(iterator.Current);
while (iterator.MoveNext())
set.IntersectWith(iterator.Current);
return set;
}
}
使用此功能,您可以编写IntersectAll(dictionary.Values.Cast<IEnumerable<string>>())
来获取交叉点。
答案 1 :(得分:2)
我认为您正在寻找以下内容;
List<string> TheIntersection = myDict.Select(x => x.Value).Aggregate((c, n) => c.Intersect(n)).ToList();
答案 2 :(得分:1)
我有一个类似于OP的问题,最后使用Skeet's solution(类似于Servy的解决方案)
public List<T> IntersectAll<T>(IEnumerable<IEnumerable<T>> lists)
{
HashSet<T> hashSet = null;
foreach (var list in lists)
{
if (hashSet == null)
hashSet = new HashSet<T>(list);
else
hashSet.IntersectWith(list);
}
return hashSet == null ? new List<T>() : hashSet.ToList();
}
然后你可以通过......获得相交的列表。
var intersectedList = IntersectAll(myDictionary.Values);