如何在 if 块中使用“x”变量?如果语句为真,我想返回 x 的 Id 字段。
if (UserList.Any(x => x.Type == (int)UserType.SuperUser))
{
return x.Id;
}
您无法访问 lambda 表达式之外的“LINQ 变量”。
您要做的是获取满足条件Id
的任何元素的属性。x
x.Type == (int)UserType.SuperUser
在这种情况下,将您Any()
的替换为FirstOrDefault()
.
var item = UserList.FirstOrDefault(x => x.Type == (int)UserType.SuperUser);
if(item != null)
return item.Id;
FirstOrDefault(x => condition on x)
返回满足条件的第一个元素,null
如果没有元素满足条件。
如果要获取Id
所有满足条件的元素的值,使用Where
和Select
extension方法:
return UserList.Where(x => x.Type == (int)UserType.SuperUser).Select(x => x.Id);
Where(x => condition(x))
如果您希望获得“正常”列表,则返回IEnumerable
包含满足条件的所有元素的 an,添加ToList()
before ;
。
您期望多少匹配:即您希望列表中有多少用户具有 SuperUser 类型?
如果您希望只有一个匹配的用户(因此匹配的用户为零或匹配的用户不止一个是错误的),那么使用 Single:
return UserList.Single(x => x.Type == (int)UserType.SuperUser).Id;
(请注意,如果没有一个完全匹配的用户,这将引发异常;或者,您可以使用 SingleOrDefault 然后测试 null。)
如果您希望有一个或多个,而您只想返回第一个:
return UserList.First(x => x.Type == (int)UserType.SuperUser).Id;
(请注意,如果没有一个完全匹配的用户,这将引发异常;或者,您可以使用 FirstOrDefault 然后测试是否为空。)
如果您希望有一个或多个,并且想要返回所有匹配用户的所有 Id 的数组:
return UserList.Where(x => x.Type == (int)UserType.SuperUser).Select(u => u.Id).ToArray();
只是为了添加已经发布的好答案。
要使 Sam Holloways 答案中的最后一个代码示例看起来像您直接使用 x ,您可以将其重写为类似 SQL 的语法(不记得那叫什么):
IEnumerable<int> userIds = from x in UserList
where x.Type == UserType.SuperUser
select x.Id;
您可以使用 userIds 上的 count 方法来确定是否有人满足您的条件。
由于您要返回 id,而且我猜 id 是一个 int,无论如何您都必须返回一些东西,而且我猜如果它不存在,您将返回 0,您可以使用:
return UserList.Where(x => x.Type == UserType.SuperUser).Select(x => x.Id).FirstOrDefault();