我发现自己编写了很多像这样的代码来选择一个匹配的项目
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()
- 如果为空/未找到则返回默认值,如果存在重复则抛出stu*_*rtd 15
FirstOrDefault或SingleOrDefault可能很有用,具体取决于您的场景,以及您是否要处理零或多个匹配:
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)
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)
.
这可以更好地浓缩到这一点.
var item = Items.First(x => x.Id == 123);
您的查询当前正在收集可枚举中的所有结果(并且可能存在多个结果),然后从该集合中获取第一个结果,执行超出必要的工作.
Single/SingleOrDefault是值得的,但只有当你想迭代整个集合并验证匹配是唯一的,除了选择匹配.无论实际存在多少重复,First/FirstOrDefault将只进行第一场比赛并离开.
归档时间: |
|
查看次数: |
178603 次 |
最近记录: |