1

我有 a List<A>,其中 A 包含一个名为 的属性TypeId,以及 a 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

这样做最有效的方法是什么?

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

4

2 回答 2

4

使用 LINQ,使用 Join 方法相当简单。

var join = ListA.Join(ListB, la => la.TypeId, lb => lb.TypeId, (la, lb) => la);
于 2012-05-25T18:59:34.917 回答
0

我猜您正在尝试进行相交操作,并且应该可以使用相交扩展。这里的一个优点是 intersect 将在 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);
        }
    }
}
于 2012-05-25T20:56:02.227 回答