Linq OR运算符?

时间:2018-10-23 17:01:33

标签: c# linq

我有从Animal派生的Dogs and Cats类。我想找到第一个黑色的动物。我目前正在执行以下操作:

Animal blackAnimal = dogs.FirstOrDefault(d => d.Color == "Black");
if (blackAnimal == null)
{
    blackAnimal = cats.FirstOrDefault(c => c.Color == "Black");
}

我希望能够在同一条语句中做到这一点-找到第一只黑狗,但是如果没有黑色的狗,则找到第一只黑猫。

请注意,Color属性不是来自Animal,而是DogCat上的独立属性。

3 个答案:

答案 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();