[英]Find the intersection of two lists using the RavenDB 4 LINQ provider
[英]Find the intersection of two lists in 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 中做到這一點?
您可以使用Intersect
方法:
var c = a.Intersect(b);
這將返回 a 和 b 中的所有值。 但是,不考慮項目在列表中的位置。
您可以使用相交:
var a = new List<int>();
var b = new List<int>();
var c = a.Intersect(b);
生成一個列表c
其中包含列表a
和b
中存在的所有元素:
List<int> c = a.Intersect(b).ToList();
與您的代碼等效的 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();
這是我的交集版本:
var a = new List<int>();
var b = new List<int>();
// intersection
var c = a.Where(x => b.Any(y => x == y)).ToList();
正如 Chris 在他對原始問題的評論中提到的,提供的示例代碼將返回列表 c 中的重復項(有關詳細信息,請參閱他的評論)。 相交只會返回不同的值。 要復制原始示例代碼的行為,請嘗試以下操作:
var c = (from value in a
where b.Contains(a)
select a);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.