2

我有一个dictionary<int, List<string>>并且我想与每个 int 的所有列表相交。

我将如何实现这一目标?我觉得这应该很容易,但由于某种原因它没有成功。

谢谢。

4

3 回答 3

6

迭代列表序列很容易,将第一个放入 aHashSet然后将每个子序列列表与其相交:

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>>())以获得交叉点。

于 2013-11-14T18:09:19.460 回答
2

我认为您正在寻找类似以下的内容;

List<string> TheIntersection = myDict.Select(x => x.Value).Aggregate((c, n) => c.Intersect(n)).ToList();
于 2013-11-14T17:58:14.490 回答
1

不久前我有一个与 OP 类似的问题,最终使用了Skeet 的解决方案(类似于 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);
于 2013-11-14T19:11:27.007 回答