列表中包含两个属性的项目
Items with both properties contained in a list
我有一个对象列表 X
(名称为 x
),具有相同类型 Location
的属性 a
和 b
。我还有一个位置列表 y
。我需要在 x
中找到列表 y
.
中包含 a
和 b
的所有对象
我可以用循环和 Where
s 来完成,但由于两个列表都很大,我需要一个性能非常好的解决方案。在这种情况下有什么方法可以使用 Intersect
吗?或者别的什么?
这里是一些伪代码
class X
{
Location a;
Location b;
}
GetMatches(List<X> x, List<Location> y) { ?? }
首先将 y 列表转换为 HashSet
。
var yHashSet = y.ToHashSet();
那么获取匹配项又快又简单:
private static List<X> GetMatches(List<X> x, HashSet<Location> y)
{
return x
.Where(item => y.Contains(item.a) && y.Contains(item.b))
.ToList();
}
使其并行以变得更快:
private static List<X> GetMatchesParallel(List<X> x, HashSet<Location> y)
{
return x
.AsParallel()
.AsOrdered()
.Where(item => y.Contains(item.a) && y.Contains(item.b))
.ToList();
}
我有一个对象列表 X
(名称为 x
),具有相同类型 Location
的属性 a
和 b
。我还有一个位置列表 y
。我需要在 x
中找到列表 y
.
a
和 b
的所有对象
我可以用循环和 Where
s 来完成,但由于两个列表都很大,我需要一个性能非常好的解决方案。在这种情况下有什么方法可以使用 Intersect
吗?或者别的什么?
这里是一些伪代码
class X
{
Location a;
Location b;
}
GetMatches(List<X> x, List<Location> y) { ?? }
首先将 y 列表转换为 HashSet
。
var yHashSet = y.ToHashSet();
那么获取匹配项又快又简单:
private static List<X> GetMatches(List<X> x, HashSet<Location> y)
{
return x
.Where(item => y.Contains(item.a) && y.Contains(item.b))
.ToList();
}
使其并行以变得更快:
private static List<X> GetMatchesParallel(List<X> x, HashSet<Location> y)
{
return x
.AsParallel()
.AsOrdered()
.Where(item => y.Contains(item.a) && y.Contains(item.b))
.ToList();
}