我有一个名为LabFileBase的基类.我构建了一个List并将我的派生类添加到它.我想根据我定义的键在List中搜索特定对象.我遇到的问题是你如何在LINQ表达式中转发?
以下是一些示例代码:
public abstract class LabFileBase { } public class Sample1 : LabFileBase { public string ID {get;set;} public string Name {get;set;} //.. } public class Sample2 : LabFileBase { public string ID {get;set;} public string Name {get;set;} //.. }
我想搜索特定的Sample2类型,但如果我使用这样的常规foreach循环,我需要向下转换:
foreach(var s in processedFiles) //processedFiles is a Listif (s is Sample2) var found = s as Sample2; if (found.ID = ID && found.Name == "Thing I'm looking for") //do extra work
我宁愿有这样的事情:
var result = processedFiles.Select(s => s.ID == SomeID && s.Name == SomeName);
这是可能的,涉及到什么语法标点符号,或者foreach
由于不同的对象而成为我唯一的选择.Sample1和Sample2只有ID和Name作为相同的字段.
编辑:感谢大家的支持和建议,我已经将几乎所有内容都输入了积压工具中.
为什么不把ID
和Name
成的基类?然后你不需要任何向下转发.
如果你确实需要进行投射,那么Cast
和OfType
操作符可能会对你有所帮助.每个都将序列转换为指定类型的序列:Cast
假设每个元素都是正确的类型(如果不是这样,则抛出异常); OfType
更像是C#as
操作符,只返回恰好类型的元素而忽略其他元素.
要详细说明Jon的答案,OfType
如果你不愿意将这些字段放入你的基类中,几乎肯定是正确的算子.例如:
foreach(var s in processedFiles.OfType()) if(s.ID == ID && s.Name == "Thing I'm looking for") // whatever foreach(var s in processedFiles.OfType ()) if(s.ID == ID && s.Name == "Some other thing") // and so on