如何在列表 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
最有效的

方法是什么?

我知道这很简单,但我的大脑今天感觉很愚蠢......

如何在列表 A 中选择具有与列表 B 中项目的属性匹配的属性的项目

使用

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);
        }
    }
}