我有这个类结构
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();
list
是List<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)
[...]
}
答案 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);