2

4 つのリストを想像してください。すべてのリストに少なくともこの Id 文字列プロパティがありますが、他のプロパティがある場合もあります。

public class A //or B, C, D
{
    public string Id { get; set; }
    //..other properties
}

//so:  
List<A> a1 = new List<A>();
List<B> a2 = new List<B>();
List<C> a3 = new List<C>();
List<D> a4 = new List<D>();

a2、a3、a4 と組み合わせた a1 のすべての DISTINCT ID を選択したい

LINQ 構文が理想的だと思いましたが、これらを単一の文字列プロパティ (たとえば、クラス A の定義を持つもの) を持つ IEnumerable の結果にどのように組み合わせるのですか?

4

5 に答える 5

9

これらは型が異なるため、最初にId プロパティを選択して IEnumerable<string> を取得し、結果を連結します。

var query = a1.Select(a=> a.Id)
              .Concat(a2.Select(b=> b.Id))
              .Concat(a3.Select(c=> c.Id))
              .Concat(a4.Select(d=> d.Id))
              .Distinct();
于 2009-06-09T05:53:52.163 に答える
4

連合

もちろん、これを単純化できます。

var uniqueIds = (from a in a1
                 select a.Id).Concat(
                 from b in a2
                 select b.Id).Concat(
                 from c in a3
                 select c.Id).Concat(
                 from d in a4
                 select d.Id).Distinct();

Union (暗黙の「Distinct」を行う) を使用すると、次のようになります。

var uniqueIds =  (from a in a1
                 select a.Id).Union(
                 from b in a2
                 select b.Id).Union(
                 from c in a3
                 select c.Id).Union(
                 from d in a4
                 select d.Id);
于 2009-06-13T14:39:46.057 に答える
4

これも機能します:

new[] {a1, a2, a3, a4}.SelectMany(x => x.Select(y => y.Id)).Distinct();
于 2009-06-09T05:36:23.010 に答える
3

それらは本当にすべて同じタイプのリストですか? それとも持っていますか

List<A> a1 = new List<A>();
List<B> a2 = new List<B>();
List<C> a3 = new List<C>();
List<D> a4 = new List<D>();

4 つのタイプすべてに共通の文字列 Id プロパティがあるため、それらを結合しますか?

OK、あなたの編集は私が正しい軌道に乗っていたことを示しています。文字列 Id プロパティを定義するインターフェイスが必要であり、各タイプ A、B、C、および D はそのインターフェイスを実装する必要があります。

次に、各リストはインターフェイス タイプになり、連結回答が機能します。

インターフェイスを定義する能力がない場合は、LINQ を使用して各リストの Id フィールドのみをクエリし (IQueryable<String>結果を取得する必要があります)、それらの結果を連結することができます。

編集:これは、探しているものを提供するLINQクエリです。

var uniqueIds = (from a in a1
                 select a.Id).Concat(
                 from b in a2
                 select b.Id).Concat(
                 from c in a3
                 select c.Id).Concat(
                 from d in a4
                 select d.Id).Distinct();
于 2009-06-09T05:35:26.617 に答える
2

同じタイプの IEnumerables を連結して、必要な項目を選択できます。

var query = a1
    .Concat(a2)
    .Concat(a3)
    .Concat(a4)
    .Select(a => a.ID)
    .Distinct();

編集:新しい質問に基づいて...単一のクエリで異なるリストタイプから選択することはできません。これを行う最善の方法は、選択しているプロパティを含む共通の型を用意し、基本型で上記のクエリを実行することです。

于 2009-06-09T05:31:33.890 に答える