我有以下行检查是否有匹配的对象
var foo = someVar.Single(x => x.ID.ToString().Equals(txtIDField.Text));
问题是
您使用哪种最佳做法或哪些代码段来检查foo是否包含null,如果不使用上述语句来选择单个值?
答案 0 :(得分:7)
var foo = someVar.SingleOrDefault(x => x.ID.ToString().Equals(txtIDField.Text));
返回序列的单个特定元素或默认值 如果找不到那个元素。
然后检查foo不为空
if (foo != null)
{
// do something with foo
}
答案 1 :(得分:4)
使用Any,如果集合中的任何项目符合特定条件,则返回true / false:
bool haveItem = someVar.Any(x => x.ID.ToString().Equals(txtIDField.Text))
答案 2 :(得分:2)
如果记录不存在,您可能需要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()
。
答案 3 :(得分:1)
根据您的需要,您可以使用多种选项
IEnumerable.First(),
IEnumerable.FirstOrDefault(),
IEnumerable.Single,
IEnumerable.SingleorDefault,
任何
用法
如果没有找到指定条件的元素, First()
将抛出异常
FirstOrDefault
()将返回默认值(T),如果是引用类型,则返回null。
当您只期望一条记录时使用Single
,如果找不到指定条件的元素,则会抛出异常
当您期望单个或默认记录时使用singleorDefault
,不会抛出异常
如果您只想检查(不选择)是否有任何记录满足您的条件,请使用Any