Linq 在包含两个派生类的实例的列表中使用FindAll
我想知道使用FindAll方法是否可以完成以下任务: 我有一个叫Animal的基类。我有两个派生类,叫做Fish和DogLinq 在包含两个派生类的实例的列表中使用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
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)