C#找到两个或多个列表共有的数字

时间:2015-05-07 13:26:47

标签: c# linq

查找两个或更多列表中存在的数字列表的语法是什么?当我只需要检查两个列表时,我正在循环播放,但现在我需要做几个... 像

这样的东西
public class Box extends Shape
{
    public function Box(width:Number = 100, height:Number = 100, color:uint = 0)
    {
        graphics.beginFill(color)
        graphics.drawRect(0, 0,  width, height);
        graphics.endFill();
    }
}

4 个答案:

答案 0 :(得分:3)

查找任意数量的列表的交集

如果要查找列表 all 中存在的一组数字,那么Enumerable.Intersect是一种很好的方法。您甚至不必硬编码列表集合,它可以在运行时创建:

var lists = new[] { list1, list2, ..., listN }; // dynamically specified

var common = lists.First().AsEnumerable();
foreach (var list in lists.Skip(1))
{
    common = common.Intersect(list);
}

// and now common has the result, e.g.
var listOfCommonEntries = common.ToList();

查找主列表与彼此之间的交叉点的并集

如果你想找到包含列表1和列表2之间所有公共数字的集合,请将列表1和列表N之间的所有公共数字联合起来,那么它会有所不同:

var common = Enumerable.Empty<int>();
foreach (var list in lists.Skip(1))
{
    common = common.Union(lists.First().Intersect(list));
}

答案 1 :(得分:2)

您可以使用Enumerable.Intersect

List<int> commonIds = list1.Intersect(list2.Intersect(list3)).ToList();

它非常高效,因为它使用了一套。

答案 2 :(得分:1)

这是一个函数,

它返回所有2个组合的交集的并集。

public static IEnumerable<T> SharedItems<T>(this IEnumerable<IEnumerable<T>> source)
{
    var pairs =
            from s1 in source
            from s2 in source
            select new { s1 , s2 };

    var intersects = pairs
        .Where(p => p.s1 != p.s2)
        .Select(p => p.s1.Intersect(p.s2));

    return intersects.SelectMany(i => i).Distinct();
}

答案 3 :(得分:-1)

自定义

void Main()
{
     List<int> one = new List<int>() {1, 3, 4, 6, 7};
     List<int> second = new List<int>() {1, 2, 4, 5};

     foreach(int r in one.Intersect(second))
        Console.WriteLine(r);
}