[英]How to filter base class collection based on a derived class field?
假設我有一個名為MyThings
的集合,其中包含Thing
類的對象,而我有一個名為ShinyThing
的類,該類派生自Thing
,所以我這樣做:
MyThings boxWithMyThings = new MyThings();
ShinyThing Diamond = new ShinyThing(){ facets = 10; weight = 500 };
boxWithMyThings.Add(Diamond);
如何使用派生類的屬性過濾集合boxWithMyThings
?
想必您只想要ShinyThings? 如果是這樣,請使用OfType
:
// I'm assuming MyThings implements IEnumerable<MyThing>
var heavyShinyThings = boxWithMyThings.OfType<ShinyThing>()
.Where(x => x.weight > 100);
你可以嘗試使用OfType
方法,只要boxWithMyThings
實現IEnumerable<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
謂詞放到一個大的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;
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.