在linq中找到两个列表的交集?

时间:2011-02-21 11:53:21

标签: c# linq

我有int A,B的列表。我想在linq中执行以下步骤

list<int> c = new List<int>();

for (int i = 0; i < a.count; i++)
{
    for (int j = 0; j < b.count; j++)
    {
        if (a[i] == b[j])
        {
            c.add(a[i]);
        }
    }
}

如果它的a和b是object,我需要检查这种方式的特定属性并添加列表,如果它等于我怎样才能在linq中执行此操作?

6 个答案:

答案 0 :(得分:62)

您可以使用Intersect方法:

var c = a.Intersect(b);

这将返回a和b中的所有值。但是,不考虑列表中项目的位置。

答案 1 :(得分:14)

您可以使用Intersect

var a = new List<int>();
var b = new List<int>();

var c = a.Intersect(b);

答案 2 :(得分:6)

代码的LINQ等价物是:

var c = from i in Enumerable.Range(0, a.Count)
        from j in Enumerable.Range(0, b.Count)
        where a[i] == b[j]
        select a[i];

var cList = c.ToList();

但这样做更好:

var c = from aItem in a 
        join bItem in b on aItem equals bItem
        select aItem;

var cList = c.ToList();

但这不会过滤重复项。要完全删除重复项 ,您可以执行以下操作:

var cList = a.Intersect(b).ToList();

如果您希望副本显示的次数与b中显示的重复次数相同,例如:

var aSet = new HashSet<int>(a);
var cList = b.Where(aSet.Contains)
             .ToList(); 

答案 3 :(得分:3)

生成一个列表c,其中包含ab列表中的所有元素:

List<int> c = a.Intersect(b).ToList();

答案 4 :(得分:1)

这是我的十字路口版本:

var a = new List<int>();
var b = new List<int>();

// intersection
var c = a.Where(x => b.Any(y => x == y)).ToList();

答案 5 :(得分:0)

正如克里斯在对原始问题的评论中提到的那样,提供的示例代码将在列表c中返回重复项(有关详细信息,请参阅其评论)。相交只会返回不同的值。要复制原始示例代码的行为,请尝试以下操作:

var c = (from value in a
         where b.Contains(a)
         select a);