我有从Animal派生的Dogs and Cats类。我想找到第一个黑色的动物。我目前正在执行以下操作:
Animal blackAnimal = dogs.FirstOrDefault(d => d.Color == "Black");
if (blackAnimal == null)
{
blackAnimal = cats.FirstOrDefault(c => c.Color == "Black");
}
我希望能够在同一条语句中做到这一点-找到第一只黑狗,但是如果没有黑色的狗,则找到第一只黑猫。
请注意,Color
属性不是来自Animal
,而是Dog
和Cat
上的独立属性。
答案 0 :(得分:4)
使用Concat:
dogs
.Cast<Animal>()
.Concat(cats)
.FirstOrDefault(d => d.Color == "Black");
它将枚举第一个之后的第二个集合。
由于您要搜索不同的属性,因此可以
var result = dogs.FirstOrDefault(x => x.Color1 == "Black") as Animal ??
cats.FirstOrDefault(x => x.Color2 == "Black");
答案 1 :(得分:1)
迭戈·托雷斯(Diego Torres)的答案很完美,但我将提供另一种解决方法,在他的解决方案不起作用的情况下可以适用:
Animal blackAnimal = (Animal)dogs.FirstOrDefault(d => d.Color == "Black") ?? cats.FirstOrDefault(c => c.Color == "Black");
答案 2 :(得分:1)
如果集合不是基本类型,则需要全部.Cast
。
鉴于Color
不是Animal的属性,您将必须执行以下操作:
var animal = dogs
// check for dogs
.Where(d => d.Color == "Black").Cast<Animal>()
// check for cats
.Concat(cats.Where(c => c.Color == "Black").Cast<Animal>())
// get the first
.FirstOrDefault();