我如何从列表中查询一个对象而不获得集合

本文关键字:集合 一个对象 查询 列表 | 更新日期: 2023-09-27 17:53:29

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个对象的列表中选择一个对象。使用什么语法(如果存在的话)从该查询中只返回一个对象,而不是只包含一个对象的集合?

我如何从列表中查询一个对象而不获得集合

使用FirstOrDefault

return treatment.FirstOrDefault();

返回序列中的第一个对象,否则返回类型的默认值,引用类型返回null,值类型返回默认值(无论类型是什么)。

使用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);

如果你不关心是否有多个匹配,或者是否没有匹配,因此你只想要第一个匹配,如果它存在(或null,如果不存在,治疗是一个引用类型):

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);