我有一个List<Animal>
,其中Animal
有一个:
int GetId();
返回动物的Id。
鉴于Id,获得特定动物的最佳方法是什么?我想知道是否有正确的方法来执行以下操作:
targetId = 2;
targetAnimal = animalList.Select(a => a.GetId() == targetId)
答案 0 :(得分:3)
您可以尝试这些方法
。单独或.SingleOrDefault
targetAnimal = animalList.SingleOrDefault(a => a.GetId() == targetId)
.First或.FirstOrDefault
targetAnimal = animalList.FirstOrDefault(a => a.GetId() == targetId)
您可能想了解有关这些功能的更多信息
Single() - 正好有1个结果,如果没有返回结果或多个结果,则抛出异常。
SingleOrDefault() - 与Single()相同,但它可以处理空值。
First() - 至少有一个结果,如果没有返回结果则抛出异常。
FirstOrDefault() - 与First()相同,但不会抛出任何异常,或者在没有结果时返回null。
答案 1 :(得分:1)
您可以尝试使用FirstOrDefault
:
var targetAnimal = animalList.FirstOrDefault(a => a.GetId() == targetId);
如果列表中找到了Id
与targetId
匹配的动物,则会将其分配给targetAnimal
。否则targetAnimal
将为空。
有关此方法的详细信息,请查看here。
答案 2 :(得分:1)
您可以使用First
或FirstOrDefault
方法。
如果没有元素具有ID,前者将抛出异常;后者将返回default(T)
(对于引用类型(类)将为null
,并为值类型(struct)初始化为默认值的所有字段。)
return animalList.First(a => a.GetId() == targetID);
和
return animalList.FirstOrDefault(a => a.GetId() == targetID);
如果要返回默认/回退值而不是default(T)
,可以使用null-coalescing运算符:
return animalList.FirstOrDefault(a => a.GetId() == targetID) ?? theFallbackValue;
答案 3 :(得分:1)
选择是“选择”值,如果需要类型,则要使用“过滤”进行过滤。
示例:
targetAnimal = animalList.Where(animal => animal.GetId() == targetId)
.First()
但是,首先承认条件,因此您可以跳过Where并直接使用First:
targetAnimal = animalList.First(animal => animal.GetId() == targetId)
此外,如果没有找到具有该Id的动物,则会抛出错误。如果您希望它返回null,请使用FirstOrDefault
targetAnimal = animalList.FirstOrDefault(animal => animal.GetId() == targetId)