如何在不获取集合的情况下从列表中查询一个对象?

时间:2014-03-26 14:35:23

标签: c#

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

3 个答案:

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