簡體   English   中英

如何基於派生類字段過濾基類集合?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM