1

AにList<A>は というプロパティが含まれてTypeIdおりList<B>、B には というプロパティも含まれています。TypeId

List<A>where を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

交差操作を行おうとしていると思いますが、交差拡張機能を使用すると可能になるはずです。ここでの利点の 1 つは、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 に答える