如何在列表 A 中选择具有与列表 B 中项目的属性匹配的属性的项目
本文关键字:项目 属性 列表 选择 | 更新日期: 2023-09-27 18:35:27
我有一个List<A>
,其中A包含一个名为TypeId
的属性,以及一个List<B>
,其中B还包含一个名为TypeId
我想从List<A>
中选择所有项目,其中List<B>
包含的项目B.TypeId == A.TypeId
ListA.Add(new A { TypeId = 1 });
ListA.Add(new A { TypeId = 2 });
ListA.Add(new A { TypeId = 3 });
ListB.Add(new B { TypeId = 3 });
ListB.Add(new B { TypeId = 4 });
ListB.Add(new B { TypeId = 1 });
???? // Should return items 1 and 3 only
最有效的方法是什么?
我知道这很简单,但我的大脑今天感觉很愚蠢......
使用
LINQ,使用 Join 方法非常简单。
var join = ListA.Join(ListB, la => la.TypeId, lb => lb.TypeId, (la, lb) => la);
我想您正在尝试进行相交操作,并且应该可以通过相交扩展进行操作。这里的一个优点是相交将以 O(m + n 为单位运行)。示例程序:
class Program
{
class Bar
{
public Bar(int x)
{
Foo = x;
}
public int Foo { get; set; }
}
class BarComparer : IEqualityComparer<Bar>
{
public bool Equals(Bar x, Bar y)
{
return x.Foo == y.Foo;
}
public int GetHashCode(Bar obj)
{
return obj.Foo;
}
}
static void Main(string[] args)
{
var list1 = new List<Bar>() { new Bar(10), new Bar(20), new Bar(30)};
var list2 = new List<Bar>() { new Bar(10), new Bar(20) };
var result = list1.Intersect(list2, new BarComparer());
foreach (var item in result)
{
Console.WriteLine(item.Foo);
}
}
}