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

rat*_*tty 43 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]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Fem*_*ref 64

你可以使用这个Intersect方法:

var c = a.Intersect(b);
Run Code Online (Sandbox Code Playgroud)

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

  • 要为遇到此问题的其他人保存Google,相反的LINQ方法是"除外". (32认同)
  • OP的代码也没有考虑到位置,所以这不是问题 - 但OP的代码做了一些非常不寻常的事情[`Intersect`](https://msdn.microsoft.com/en-us/library/system.linq .enumerable.intersect.aspx)不会:对于'a`和`b`中存在的每个不同元素**e**,**e**被添加到`c` _**n**times_,其中**n**= [在'a`中出现**e**的次数]*[在'b`中出现**e**的次数].这根本不是一个交叉点,但是OP可能会产生交叉并且只是错误实现了它? (3认同)

Kla*_*sen 14

您可以使用Intersect:

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

var c = a.Intersect(b);
Run Code Online (Sandbox Code Playgroud)

  • 是的,有一个重写需要第二个参数,您可以使用它来根据特定属性而不是默认属性比较运算符来比较列表。https://msdn.microsoft.com/en-us/library/bb355408(v=vs.110).aspx (2认同)

And*_*tad 7

生成一个列表,c其中包含出现在两个列表a和中的所有元素b

List<int> c = a.Intersect(b).ToList();
Run Code Online (Sandbox Code Playgroud)


Ani*_*Ani 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();
Run Code Online (Sandbox Code Playgroud)

但这样做更好:

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

var cList = c.ToList();
Run Code Online (Sandbox Code Playgroud)

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

var cList = a.Intersect(b).ToList();
Run Code Online (Sandbox Code Playgroud)

如果您希望重复项显示次数b,例如:

var aSet = new HashSet<int>(a);
var cList = b.Where(aSet.Contains)
             .ToList(); 
Run Code Online (Sandbox Code Playgroud)