我有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中执行此操作?
答案 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
,其中包含a
和b
列表中的所有元素:
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);