最好的linq-able方式是否有匹配的对象?

时间:2013-07-31 09:42:22

标签: c# .net linq

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

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

问题是

您使用哪种最佳做法或哪些代码段来检查foo是否包含null,如果不使用上述语句来选择单个值?

4 个答案:

答案 0 :(得分:7)

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

返回序列的单个特定元素或默认值   如果找不到那个元素。

SingleOrDefault()

然后检查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)

如果记录不存在,您可能需要SingleOrDefaultSingle会抛出异常,例如。

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