我有以下行检查是否有匹配的对象
var foo = someVar.Single(x => x.ID.ToString().Equals(txtIDField.Text));
问题是
什么是最佳实践或您使用哪个代码片段来检查 foo 是否包含 null,如果不使用上述语句来选择单个值?
var foo = someVar.SingleOrDefault(x => x.ID.ToString().Equals(txtIDField.Text));
返回序列的单个特定元素,如果未找到该元素,则返回默认值。
然后检查 foo 不为空
if (foo != null)
{
// do something with foo
}
使用Any,如果集合中有任何符合特定条件的项目,则返回 true / false:
bool haveItem = someVar.Any(x => x.ID.ToString().Equals(txtIDField.Text))
你可能想要SingleOrDefault ,如果记录不存在,Single会抛出异常,例如
var item = someVar.SingleOrDefault(x => x.ID.ToString().Equals(txtIDField.Text));
if (item != null)
{
// item exists!
}
如果您从一般角度提出问题,这是我的规则:
Single()
/ First()
- 返回我知道存在的单个项目。SingleOrDefault()
/ - 返回可能存在FirstOrDefault()
的单个项目。Where()
- 返回多个可能存在的项目。Any()
/ Contains()
- 检查项目是否存在决定使用哪一个真的取决于你在做什么。例如,如果您只是想检查记录是否存在但无意使用它,我会建议使用Any()
或Contains()
仅仅因为它们更快。但是,如果您在找到记录后需要对记录进行实际操作,那么其他检索查询会更理想,即FirstOrDefault()
/ SingleOrDefault()
。
根据您的需要,您有多种选择,您可以使用其中任何一种
IEnumerable.First(),
IEnumerable.FirstOrDefault(),
IEnumerable.Single,
IEnumerable.SingleorDefault,
任何。
用法
First()
如果没有找到满足指定条件的元素,将抛出异常
FirstOrDefault
() 将返回 default(T) 或 null 在引用类型的情况下)。
当您期望只有一条记录时使用Single
,如果没有找到指定条件的元素,将抛出异常
当您期望单个或默认记录时使用singleorDefault
,不会引发异常
Any
如果您只想检查(而不是选择)是否有任何记录满足您的条件,请使用