Linq代码选择一个项目

Mik*_*rth 101 c# linq

我发现自己编写了很多像这样的代码来选择一个匹配的项目

var item = (from x in Items where x.Id == 123 select x).First();
Run Code Online (Sandbox Code Playgroud)

是否有一种更清洁的方式,或者这是如何简洁,我会得到?

编辑:应该说"使用linq语法的清洁方式".我已经知道了lambda语法,它开始看起来这实际上是唯一的方法.我确实得到了一些有用的信息,所以感谢所有回复的人.

Jam*_*are 168

取决于您对linq查询语法的喜好程度,您可以直接使用扩展方法,如:

var item = Items.First(i => i.Id == 123);
Run Code Online (Sandbox Code Playgroud)

如果您不想在列表为空时抛出错误,请使用FirstOrDefault返回元素类型的默认值(null对于引用类型):

var item = Items.FirstOrDefault(i => i.Id == 123);

if (item != null)
{
    // found it
}
Run Code Online (Sandbox Code Playgroud)

Single()并且SingleOrDefault()也可以使用,但如果你正在从数据库或已经保证唯一性的东西中读取,我不会打扰,因为它必须扫描列表以查看是否有任何重复和抛出. First()FirstOrDefault()停在第一场比赛,所以他们更有效率.

在中First()Single()家人,这里就是他们扔:

  • First() - 如果空/未找到则抛​​出,如果重复则不抛出
  • FirstOrDefault() - 如果为空/未找到则返回默认值,如果重复则不返回
  • Single() - 如果为空/未找到则抛​​出,如果存在重复则抛出
  • SingleOrDefault() - 如果为空/未找到则返回默认值,如果存在重复则抛出

  • 我认为你在那里缺少两个等号。应该是`i.Id == 123` (2认同)

stu*_*rtd 15

FirstOrDefaultSingleOrDefault可能很有用,具体取决于您的场景,以及您是否要处理零或多个匹配:

FirstOrDefault:返回序列的第一个元素,如果没有找到元素,则返回默认值.

SingleOrDefault:返回序列的唯一元素,如果序列为空,则返回默认值; 如果序列中有多个元素,则此方法抛出异常

我不知道这在linq'from'查询中是如何工作的,但在lambda语法中它看起来像这样:

var item1 = Items.FirstOrDefault(x => x.Id == 123);
var item2 = Items.SingleOrDefault(x => x.Id == 123);
Run Code Online (Sandbox Code Playgroud)

  • 接受的答案完全解决了这个问题,但基本上 FirstOrDefault 一旦找到匹配就停止,但 SingleOrDefault 必须检查整个列表以确保 ** 恰好有一个**匹配。 (2认同)

Jam*_*ill 10

这些是首选方法:

var item = Items.SingleOrDefault(x => x.Id == 123);
Run Code Online (Sandbox Code Playgroud)

要么

var item = Items.Single(x => x.Id == 123);
Run Code Online (Sandbox Code Playgroud)


小智 10

只是为了让某人的生活更轻松,使用lambda表达式查询linq

(from x in Items where x.Id == 123 select x).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

确实导致带有a的SQL查询 select top (1).


Chr*_*non 7

这可以更好地浓缩到这一点.

var item = Items.First(x => x.Id == 123);

您的查询当前正在收集可枚举中的所有结果(并且可能存在多个结果),然后从集合中获取第一个结果,执行超出必要的工作.

Single/SingleOrDefault是值得的,但只有当你想迭代整个集合并验证匹配是唯一的,除了选择匹配.无论实际存在多少重复,First/FirstOrDefault将只进行第一场比赛并离开.