Answers:
根据您对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()
也可以使用,但是如果您正在从数据库中读取数据或已经保证唯一性的内容,那么我不会打扰,因为它必须扫描列表以查看是否存在重复项和异常。 First()
并FirstOrDefault()
在第一场比赛中停下来,这样他们的效率更高。
在First()
和Single()
家庭中,这是他们扔的地方:
First()
-如果为空/未找到则抛出,如果重复则不抛出FirstOrDefault()
-如果为空/未找到,则返回默认值,如果重复则不抛出Single()
-如果为空/未找到则抛出,如果存在重复则抛出SingleOrDefault()
-如果为空/未找到,则返回默认值;如果存在重复项,则返回i.Id == 123
根据您的情况以及是否要处理零个或多个匹配项,FirstOrDefault或SingleOrDefault可能有用。
FirstOrDefault:返回序列的第一个元素,如果找不到元素,则返回默认值。
SingleOrDefault:返回序列的唯一元素;如果序列为空,则返回默认值;否则返回默认值。如果序列中有多个元素,则此方法将引发异常
我不知道这在linq'from'查询中如何工作,但是在lambda语法中,它看起来像这样:
var item1 = Items.FirstOrDefault(x => x.Id == 123);
var item2 = Items.SingleOrDefault(x => x.Id == 123);
这些是首选方法:
var item = Items.SingleOrDefault(x => x.Id == 123);
要么
var item = Items.Single(x => x.Id == 123);
您可以使用扩展方法语法:
var item = Items.Select(x => x.Id == 123).FirstOrDefault();
除此之外,我不确定如果不编写自己的专用“ First”和“ FirstOrDefault”扩展方法,您可以获得多少简洁性。
Where
与相对Select
,它已经被陈述过了,但是这个答案是不正确的。在c#中选择将结果更改为IEnumerable <bool>,因此您将获得bool
第一项的x.Id == 123
我会告诉你什么对我有用:
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获取的,然后使用它进行查询,但是此查询返回一行,然后您可以将从查询中获取的值分配给文本框,或其他,我不得不将它们分配给文本框。
Single()
并且SingleOrDefault()
如果我知道数据已经是唯一的(例如,来自具有该约束的数据库等),因为Single()
它会强制其扫描列表的其余部分以查找可能的重复项,但这就是我。如果此时需要增强唯一性,请使用Single()
家庭,否则请使用First()
家庭。