OfType预制件而不是过滤器

时间:2013-11-05 09:15:50

标签: c# ienumerable oftype

假设我的数据库中有2个类:Class FooBar和Class BarFoo。我对我的数据库执行查询,返回类FooBos,其中包含一个FooBar列表列表可以包含BarFoo的实例(不要问我为什么,这是我如何得到数据库而我可以'编辑它)。

无论如何要构建我的Domain对象,我会检查哪个类使用以下代码

if(FooBos.FooBars.OfType<BarFoo>().Count() != 0)
  //Do things for FooBar here
else
  //Do Things for BarFoo here

所以问题是在OfType之后整个列表属于Type BarFoo,我似乎无法弄清楚原因。

任何人都知道为什么会这样?

2 个答案:

答案 0 :(得分:1)

通常,只要存在继承关系,就会使用OfType<>。在你的情况下,我怀疑FooBar是BarFoo的孩子。

如果是这种情况,则表示列表中的所有对象都是继承BarFoo,或者它们只是BarFoo对象;所以OfType<BarFoo>会返回所有对象。

答案 1 :(得分:1)

如果你不介意迭代两次(使用Linq),你可以使用两个单独的语句:

foreach (BarFoo barfoo in FooBos.FooBars.OfType<BarFoo>()
    // Do something with barfoo

foreach (FooBar foobar in FooBos.Foobars.OfType<FooBar>()
    // Do something with foobar

否则你将不得不在一个循环中完成它:

foreach (var entry in FooBos.FooBars)
{
    BarFoo barfoo = entry as BarFoo;

    if (barfoo != null)
    {
        // Do something with barfoo
    }
    else
    {
        FooBar foobar = entry as FooBar;

        if (foobar != null)
        {
            // Do something with foobar
        }
    }
}