3

LINQ に異なる型として提示されている 10 個のテーブルがありますが、まったく同じプロパティを共有しています。それらに対してユニオンを実行しようとすると、コンパイラは次のように伝えます。

"Argument 2: cannot convert from 'System.Collections.IEnumerable' to 'System.Collections.Generic.IEnumerable<LINQPad.User.TelJun2011>'"

コードは次のようになります

var jul = (from n in TelJul2011s select n);

var jun = (from p in TelJun2011s select p);

jun.Union(jul).Dump();

私は調査を行い、ユニオンは異なる型間で実行できないことを理解しています。また、同じプロパティを共有している場合、匿名型でユニオンを実行できることも理解しています。すべてのテーブルのすべてのプロパティが必要であり、同じ匿名型を 10 回 (変数ごとに 1 回) 入力する必要がないため、このオプションは機能しません。すべてのプロパティが同一であるという事実に基づいて、それらがすべて同じ型であるとコンパイラーに推測させたいのです。

AsQueryable() タイプの関数と「as」キーワードの両方を使用して、IEnumberable、Iqueryable、Datatable などにキャストしようとしました。どれも私にとってはうまくいかないようです。

親タイプに動的にキャストすることでこれを行う方法があるかどうか疑問に思っています。クラスの初期宣言を編集できないため、キャスト先の共通インターフェイスを実装できません。しかし、各型から親インターフェイスへの変換を記述せずに、使用時に型を共通のインターフェイスにダウンキャストできる方法はありますか?

アドバイスをありがとう!

4

3 に答える 3

9

の結果は にUnionなりますIEnumerable<Xxx>が、この場合は何を指定する必要がありますXxx。タイプTelJun2011TelJul2011が構造体 (値タイプ) でない場合、のような共分散を利用できます。IEnumerable<out T>

jun.Union<object>(jul)

これが機能するのは、TelJun2011TelJul2011が bothobjectであり、共分散によりIEnumerable<TelJun2011>andIEnumerable<TelJul2011>が bothであるからIEnumerable<object>です。

もちろん、とobjectに共通するすべてのプロパティを持っているわけではありません。これらの 2 つの型がより便利な共通の基本クラスを持っているか、共通のインターフェイスを実装していれば、より良いでしょう。TelJun2011TelJul2011

jun.Union<ITelMonth>(jul)

必要な共通プロパティを含む型がどこにITelMonthあったか。

于 2012-11-24T13:13:21.943 に答える
0

「問題」は、C# の静的型システムでは、達成しようとしていることが許可されないことです。オブジェクトを結合する前に、オブジェクトを基本型にキャストする必要があります。つまり、両方System.Objectに共通点がある場合は、objectまたは (.net 4.0 の場合) にキャストする必要がありますdynamic

後者は動的型チェックを強制します:

class A
{
    public int Integer { get; set; }
}

class B
{
    public int Integer { get; set; }
}

class Program
{
    public static void main(string[] args)
    {
        var a = new[] { new A { Integer = 5 }, new A { Integer = 6 }, new A { Integer = 7 } };
        var b = new[] { new B { Integer = 1 }, new B { Integer = 2 }, new B { Integer = 3 } };

        var u = a.Cast<dynamic>().Union(b).ToArray();

        var i1 = u[0].Integer;
        var i2 = u[1].Integer;
        var i3 = u[2].Integer;
        var i4 = u[3].Integer;
        var i5 = u[4].Integer;
        var i6 = u[5].Integer;
    }
}

私の意見では、これは理想的な解決策ではありませんが、役立つかもしれません。

于 2012-11-24T11:57:01.820 に答える