2

MyThingsクラスのオブジェクトを保持するという名前のコレクションがあり、 から派生したという名前のThingクラスがあるとします。ShinyThingThing

MyThings boxWithMyThings = new MyThings();
ShinyThing Diamond = new ShinyThing(){ facets =  10; weight = 500 };
boxWithMyThings.Add(Diamond);

boxWithMyThings派生クラスの属性を使用してコレクションをフィルター処理するにはどうすればよいですか?

4

2 に答える 2

4

おそらく、ShinyThings だけが必要ですか? その場合は、次を使用しますOfType

// I'm assuming MyThings implements IEnumerable<MyThing>
var heavyShinyThings = boxWithMyThings.OfType<ShinyThing>()
                                      .Where(x => x.weight > 100);
于 2013-05-22T20:33:28.573 に答える
2

実装OfTypeしている限り、メソッドを使用して試すことができます:boxWithMyThingsIEnumerable<Thing>

var filtered = boxWithMyThings.OfType<ShingThing>().Where(st => st.facets == 10);

複数のタイプをフィルタリングしたい場合(多くの同様の呼び出しと一緒にShinyThings使用できるだけではありません:Concat

IEnumerable<Thing> shinyEnough = boxWithMyThings.OfType<ShingThing>().Where(st => st.shininess >= 10);
IEnumerable<Thing> dirtyEnough = boxWithMyThings.OfType<DirtyThing>().Where(dt => dt.dirtiness >= 10);
var veryDirtyAndVeryCleanObjects = shinyEnough.Concat(dirtyEnough); 

もちろん、型とキャストをチェックすることで、Whereここにあるすべての述語を 1 つの大きなWhere節に入れることができます。

boxWithMyThings.Where(t =>  
     { 
         if (t is ShinyThing) 
                return (t as ShinyThing).shininess >= 10;
         else if (t is DirtyThing) 
                return (t as DirtyThing).dirtiness >= 10; 
         else return false;
     });
于 2013-05-22T20:34:11.610 に答える