我发现自己编写了很多像这样的代码来选择一个匹配
的项目var item = (from x in Items where x.Id == 123 select x).First();
是否有一种更清洁的方式可以做到这一点,还是像我将要的那样简洁?
编辑:应该说“使用linq语法的清洁方式”。我已经知道了lambda语法,它开始看起来这实际上是唯一的方法。我确实得到了一些有用的信息,所以感谢所有回复的人。
答案 0 :(得分:159)
取决于您对linq查询语法的喜好程度,您可以直接使用扩展方法,如:
var item = Items.First(i => i.Id == 123);
如果您不希望在列表为空时抛出错误,请使用FirstOrDefault
返回元素类型的默认值(null
作为参考类型):
var item = Items.FirstOrDefault(i => i.Id == 123);
if (item != null)
{
// found it
}
也可以使用 Single()
和SingleOrDefault()
,但如果您正在从数据库或已经保证唯一性的内容中读取内容,我不会打扰,因为它必须扫描列表以查看是否有任何内容重复和抛出。 <{1}}和First()
在第一场比赛中停止,因此效率更高。
在FirstOrDefault()
和First()
家庭中,这里是他们扔的地方:
Single()
- 如果空/未找到则抛出,如果重复则抛出First()
- 如果为空/未找到则返回默认值,如果重复则不返回FirstOrDefault()
- 如果空/未找到则抛出,如果存在重复则抛出Single()
- 如果为空/未找到则返回默认值,如果存在重复则返回答案 1 :(得分:15)
FirstOrDefault或SingleOrDefault可能会有用,具体取决于您的方案,以及您是否要处理零或多个匹配项:
FirstOrDefault:返回序列的第一个元素,如果没有找到元素,则返回默认值。
SingleOrDefault:返回序列的唯一元素或默认值 序列为空时的值;如果这个方法抛出异常
中有多个元素
我不知道这是如何在linq'from'查询中运行的,但在lambda语法中它看起来像这样:
var item1 = Items.FirstOrDefault(x => x.Id == 123);
var item2 = Items.SingleOrDefault(x => x.Id == 123);
答案 2 :(得分:10)
这些是首选方法:
var item = Items.SingleOrDefault(x => x.Id == 123);
或者
var item = Items.Single(x => x.Id == 123);
答案 3 :(得分:9)
只是为了让某人的生活更轻松,使用lambda表达式的linq查询
(from x in Items where x.Id == 123 select x).FirstOrDefault();
确实导致带有的SQL查询
其中select top (1)
。
答案 4 :(得分:7)
这可以更好地归结为此。
var item = Items.First(x => x.Id == 123);
您的查询当前正在收集可枚举内的所有结果(并且可能有多个),然后从 设置中获取第一个结果,执行的操作超出必要的范围。
Single / SingleOrDefault是值得的,但只有当你想要遍历整个集合并验证匹配是唯一的,除了选择匹配。 First / FirstOrDefault只会进行第一场比赛并离开,无论实际存在多少重复。
答案 5 :(得分:4)
您可以使用扩展方法语法:
var item = Items.Select(x => x.Id == 123).FirstOrDefault();
除此之外,我不确定你能得到多少简洁,而不用编写自己专门的“First”和“FirstOrDefault”扩展方法。
答案 6 :(得分:1)
我会告诉你什么对我有用:
int id = int.Parse(insertItem.OwnerTableView.DataKeyValues[insertItem.ItemIndex]["id_usuario"].ToString());
var query = user.First(x => x.id_usuario == id);
tbUsername.Text = query.username;
tbEmail.Text = query.email;
tbPassword.Text = query.password;
我的id是我要查询的行,在这种情况下我从radGrid获取它,然后我用它来查询,但是这个查询返回一行,然后你可以将你从查询中获得的值分配给textbox或者其他什么,我必须将它们分配给文本框。