检查List的属性是否属于给定类型

时间:2014-12-20 17:30:38

标签: c# linq list search inheritance

我有这个类结构

public class A
{
    int number;
}

public class B : A
{
    int otherNumber;
}

我想搜索A项目列表,其中number大于给定值,otherNumber大于另一个给定值,如果它们是输入B。我正在寻找类似的东西:

var results = list.Where(x => x.number>5 && x.otherNumber>7).ToList();

listList<A>

我目前的做法是:

var results = list.Where(x => x.number>5);
foreach(var result in results)
{
    B b = result As B;
    if(b!=null && b.otherNumber>7)
        [...]
}

3 个答案:

答案 0 :(得分:4)

您可以按number字段进行过滤(假设字段是公开的)。然后,如果a为otherNumber类型,则按B字段进行过滤。否则,第二次过滤将跳过

list.Where(a => a.number > 5).Where(a => !(a is B) || ((B)a).otherNumber > 7)

可能更具可读性:

list.Where(a => {
   var b = a as B;
   return a.number > 5 && (b == null || b.otherNumber > 7);
})

或查询语法

from a in list
let b = a as B
where a.number > 5 && (b == null || b.otherNumber > 7)

答案 1 :(得分:0)

选择不大于7的所有B

var badBs = list.OfType<B>().Where(x => x.otherNumber <= 7);

选择符合第一项要求的所有项目,但不符合第二项要求的项目除外:

var results = list.Where(x => x.number > 5).Except(badBs);

答案 2 :(得分:0)

这里 - 只有B对象才是匹配条件,所以最简短的形式是:

list.OfType<B>().Where(x=>x.num1 > 5 && x.num2 < 7);