public static Treatment Find(int id, List<Treatment> treatments)
{
var treatment = from t in treatments
where t.ID == id
select new Treatment(t.ID, t.Name);
return treatment;
}
在上面的例子中,我试图从~20个对象的列表中选择一个对象。什么是从该查询中只返回一个对象的语法(如果存在),而不是只包含一个对象的集合?
答案 0 :(得分:5)
使用FirstOrDefault
return treatment.FirstOrDefault();
它返回序列中的第一个对象,否则它返回类型的默认值, null 表示引用类型,默认值表示值类型(无论它是什么类型)。
答案 1 :(得分:5)
使用Enumerable.FirstOrDefault(Func<T, bool> predicate)
扩展方法,如果没有这样的项目,则从序列匹配谓词返回第一项,或者返回默认值T(参考类型 null ):
Treatment treatment = treatments.FirstOrDefault(t => t.ID == id);
这几乎与
相同treatments.Where(t => t.ID == id).FirstOrDefault()
// or treatment.FirstOrDefault()
但它的性能稍好一些(理论上)。
因此,您List<T>
也可以使用Find(Predicate<T> match)
方法:
Treatment treatment = treatments.Find(t => t.ID == id);
答案 2 :(得分:3)
如果您不在乎是否有多个匹配项,或者如果没有匹配项,那么您只需要第一个匹配项(如果不存在匹配项则为null,如果不存在匹配项,则为null):< / p>
return treatments.FirstOrDefault(t => t.ID == id);
如果您希望在没有匹配项时出现错误,但您不关心是否有多个匹配项:
return treatments.First(t => t.ID == id);
如果您希望在有多个匹配项时出错,但您不关心是否没有匹配项:
return treatments.SingleOrDefault(t => t.ID == id);
如果您希望在没有匹配项或多项匹配项时出错:
return treatments.Single(t => t.ID == id);