私はC#プログラミングの新機能であり、以下のシナリオがあるLazy Load&Typeは可能ですか?単一反復でオブジェクトをキャストしますか?
私はいくつかのオブジェクトのプロパティに基づいて反復処理したい、IEnumerableをを返すAPIを使用しています:私はフィルターで返されたオブジェクトを型キャストすることはできませんですので
IEnumerable<objects> listOfObjects = filter.getItems(id);
List<CustomObject> sortedList = new List<CustomObject>();
foreach (CustomObject obj in listOfObjects)
{
obj.Load(Load.Expanded);
sortedList.Add(obj);
}
foreach (CustomObject custObj in sortedList.OrderByDescending(c => c.RevisionDate))
{
// business logic
}
は、私は上記のすべてを行う必要がありますクエリ。また、フィルタクエリから返されたオブジェクトはロードされません。つまり、最初のforeachループを実行しないと、2番目のforeachのRevisionDate値はnullになります。
このシナリオを処理するより良い方法があるのだろうかと思っていますが、これらの数の行を1つのループで削除することはできますか? Select
その中obj.Load
のような副作用を持っているものを持つ(Select
のような使用法は、通常は落胆し、非常に良い方法ではありませんされていることを
foreach (var custObj in listOfObjects
.Cast<CustomObject>()
.Select(obj => {obj.Load(); return obj;})
.OrderByDescending(c => c.RevisionDate))
注:
uはそれを行う方法が完全に罰金です。 obj状態をロードする副作用がない場合、単純化されている可能性があります。現在のシナリオでは問題ないと思います。 –
最初に、 '.OfType()'を最初の行の最後に追加するだけで、キャストを行うことができます。第2に、使用しているフレームワークがオブジェクトをロードしない場合、別のフレームワークを使用します。 –
@PeterMorris:いいえ、キャストを行うには '.Cast()'を使います。 'OfType'を使ってフィルタリングを行います。違う理由は '誤って' listOfObjects'にいくつかの 'NotCustomObject'があると、あなたの問題を隠してしまいます。間違ったオブジェクトを持っているので' Cast'メソッドは例外をスローします。 。 –
Chris