Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 在包含两个派生类的实例的列表中使用FindAll_Linq_List - Fatal编程技术网

Linq 在包含两个派生类的实例的列表中使用FindAll

Linq 在包含两个派生类的实例的列表中使用FindAll,linq,list,Linq,List,我想知道使用FindAll方法是否可以完成以下任务: 我有一个叫Animal的基类。我有两个派生类,叫做Fish和Dog List<Animal> myAnimals = new List<Animal>(); 动物有: public string Type { get; set; } public int Height { get; set; } public int Length { get; set; } 狗有: public string Color { ge

我想知道使用FindAll方法是否可以完成以下任务:

我有一个叫Animal的基类。我有两个派生类,叫做Fish和Dog

List<Animal> myAnimals = new List<Animal>();
动物有:

public string Type { get; set; }
public int Height { get; set; }
public int Length { get; set; }
狗有:

public string Color { get; set; }
鱼:没有多余的

我想这样做:

Console.Write("\nEnter keyword to search the farm: ");
string keyword = Console.ReadLine().Trim();

var mySearch = myAnimals.FindAll(p => p.Type.Contains(keyword) || p.Color.Contains(keyword)); 
myAnimals是类型Animal的列表,包含鱼和狗的实例

List<Animal> myAnimals = new List<Animal>();
List myAnimals=new List();

问题是无法从那里访问颜色。只有基本类动物的类型、高度和长度才是可能的目标

您可以使用以下代码:

animals.FindAll(animal => animal.Type.Contains(keyword) || (((animal as Dog)?.Color.Contains(keyword)) ?? false));
那么
(((像狗一样的动物)?.Color?.Contains(关键字))?false)部分实际上做了什么

让我们把它分成几个部分:

(动物作为狗)
尝试将动物投射到类型
。如果失败,则不会引发异常,而是返回
null

由于我们无法访问
null
的属性
Color
(这将导致
NullReferenceException
),我们需要使用
?。
运算符aka。只有当
(动物作为狗)
不是
null
时,它才会尝试访问
Color
。 如果
(动物如狗)
为空,则整个表达式变为
null
。 与
Color?相同。Contains()
,因为颜色本身可以是
null

由于在
|
之后需要一个布尔表达式,
null
将不是布尔表达式,因此我们也使用
??
操作符aka。如果左侧的表达式为
null
请使用右侧的值。否则,使用左侧的值

这意味着如果
animal
是一只具有颜色属性且该属性不为空的狗,则使用
Contains(关键字)
的返回值,该值为真或假。 否则,如果
animal
不是狗或Color为null,则默认为
false
Type.Contains(关键字)| false
表示
Type.Contains(关键字)
返回的任何内容

但是,如果添加更多类型,这将变得不灵活。另一种方法是什么

例如,使用:


但是请注意,对于较大的数据集,这类操作可能效率低下。

您必须将“p”对象强制转换为Dog才能访问该属性。或者使用OfType预筛选狗:myAnimals.OfType().FindAll(dog=>dog.Color//now accessibleI实际上正朝着这个方向思考,甚至以前使用过这段代码。我收到了一条错误消息:IEnumerable不包含“FindAll”的定义,并且找不到接受“IEnumerable”类型的第一个参数的扩展方法“FindAll”(您是否缺少using指令或程序集引用?@solojuve1897执行
.OfType().ToList().FindAll(..
),现在您应该有可用的FindAll扩展方法。或者只需使用
.Where()
。但是当您使用
OfType()
时,您将找不到所有其他动物。因此,可能类似于:
animals.FindAll(animal=>animal.Type.Contains(keyword)| |(((animal as Dog)?.Color.Contains(keyword))?false);
@我要找的第一只老虎。太棒了。你能详细解释一下这行吗:((animal as Dog)?.Color.Contains(keyword))?false)