当前位置:  开发笔记 > 编程语言 > 正文

向下倾斜和Linq

如何解决《向下倾斜和Linq》经验,为你挑选了2个好方法。

我有一个名为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 List
     if (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作为相同的字段.

编辑:感谢大家的支持和建议,我已经将几乎所有内容都输入了积压工具中.



1> Jon Skeet..:

为什么不把IDName成的基类?然后你不需要任何向下转发.

如果你确实需要进行投射,那么CastOfType操作符可能会对你有所帮助.每个都将序列转换为指定类型的序列:Cast假设每个元素都是正确的类型(如果不是这样,则抛出异常); OfType更像是C#as操作符,只返回恰好类型的元素而忽略其他元素.



2> mqp..:

要详细说明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

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有