2

オブジェクトの配列を返す関数があります。問題は、オブジェクトが 3 つの異なるタイプのいずれかになる可能性があることです。これらのオブジェクトをさまざまなカスタム タイプの配列に分割しようとしています。

例えば:

var collection = something.ReturnObjArray();
var Details = collection.Where(a => a is DetailItem);
var Addenda = collection.Where(a => a is AddendaItem);

上記を実行し、foreach ループでデータにアクセスして、Addenda を詳細項目内のコレクションに配置しようとすると、次のようになります。

foreach (var addendaItem in Addenda)
{
    var detailItem = Details.Single(d => d.DetailAddendaKey == addendaItem.Key);
    detailItem.Addenda.Add(addendaItem);
}

次のようなエラーが表示されます。

「オブジェクト」には「DetailAddendaKey」の定義が含まれておらず、タイプ「オブジェクト」の最初の引数を受け入れる拡張メソッド「DetailAddendaKey」が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)

とりわけ。Details と Addenda の変数を次のように変更しようとすると、

IEnumerable<DetailItem> Details = collection.Where(a => a is DetailItem);
IEnumerable<AddendaItem> Addenda = collection.Where(a => a is AddendaItem);

上記のエラーを回避しましたが、次のようになりました。

'System.Collections.Generic.IEnumerable<object>'タイプを に暗黙的に変換することはできません'System.Collections.Generic.IEnumerable<MyNameSpace.DetailItem>'。明示的な変換が存在します (キャストがありませんか?)

私がしなければならないことはありますか?

4

2 に答える 2

7

を使用しOfType<T>ます。

指定された型に基づいて IEnumerable の要素をフィルター処理します。

例:

IEnumerable<DetailItem> Details = collection.OfType<DetailItem>();
于 2012-12-21T16:37:16.687 に答える
1

この文は型object[]のオブジェクト (オブジェクト配列) を返すのではないかと思います:

var collection = something.ReturnObjArray();

objectすべてのプロパティを持っていません!

そのため、プロパティDetails.Single(d => d.DetailAddendaKey == addendaItem.Key)dありませんDetailAddendaKey

これを行う必要があります:

var Details = collection.Where(a => a is DetailItem).Cast<DetailItem>();
var Addenda = collection.Where(a => a is AddendaItem).Cast<AddendaItem>();

または@Mark Byersが提案したように(これは上記のサンプルの省略形です):

var Details = collection.OfType<DetailItem>();
var Addenda = collection.OfType<AddendaItem>();

IEnumerable<object>これはtoDetailItemまたは内のすべてのアイテムをダウンキャストしAddendaItemています。つまり、IEnumerable<DetailItem>andが必要になりIEnumerable<AddendaItem>ます。

次に、次の文がコンパイルされ、期待どおりに機能します。

ノート

OfType<T>()is演算子を使用して後で呼び出すアプローチはCast<T>()、オブジェクト配列内の各オブジェクトを2回ダウンキャストするため、より良い選択になるはずです。

isオペレーターとその動作の詳細については、この他の質問とその回答を確認してください。

于 2012-12-21T17:03:15.263 に答える