-3

我有以下行检查是否有匹配的对象

var foo = someVar.Single(x => x.ID.ToString().Equals(txtIDField.Text));

问题是

什么是最佳实践或您使用哪个代码片段来检查 foo 是否包含 null,如果不使用上述语句来选择单个值?

4

4 回答 4

7
var foo = someVar.SingleOrDefault(x => x.ID.ToString().Equals(txtIDField.Text));

返回序列的单个特定元素,如果未找到该元素,则返回默认值。

单或默认()

然后检查 foo 不为空

if (foo != null)
{
    // do something with foo
}
于 2013-07-31T09:43:57.467 回答
4

使用Any,如果集合中有任何符合特定条件的项目,则返回 true / false:

bool haveItem = someVar.Any(x => x.ID.ToString().Equals(txtIDField.Text))
于 2013-07-31T09:43:35.850 回答
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()

于 2013-07-31T09:44:31.667 回答
1

根据您的需要,您有多种选择,您可以使用其中任何一种

IEnumerable.First(),

IEnumerable.FirstOrDefault(),

IEnumerable.Single,

IEnumerable.SingleorDefault,

任何。

用法

First()如果没有找到满足指定条件的元素,将抛出异常

FirstOrDefault() 将返回 default(T) 或 null 在引用类型的情况下)。

当您期望只有一条记录时使用Single,如果没有找到指定条件的元素,将抛出异常

当您期望单个或默认记录时使用singleorDefault,不会引发异常

Any如果您只想检查(而不是选择)是否有任何记录满足您的条件,请使用

于 2013-07-31T09:46:34.930 回答