如何在if块中使用“x”变量?如果statement为true,我想返回x的Id字段。
if (UserList.Any(x => x.Type == (int)UserType.SuperUser))
{
return x.Id;
}
答案 0 :(得分:5)
您无法访问lambda表达式之外的“LINQ变量”。
您要做的是获取满足条件Id
的任何元素x
的{{1}}属性。
在这种情况下,请将x.Type == (int)UserType.SuperUser
替换为FirstOrDefault()
。
Any()
var item = UserList.FirstOrDefault(x => x.Type == (int)UserType.SuperUser);
if(item != null)
return item.Id;
返回满足条件的第一个元素,如果没有元素满足条件,则返回FirstOrDefault(x => condition on x)
。
如果您想获得满足条件的所有元素的null
值,请使用Where
和Select
扩展方法:
Id
如果您希望获得“正常”列表,则 return UserList.Where(x => x.Type == (int)UserType.SuperUser).Select(x => x.Id);
会返回包含满足条件的所有元素的Where(x => condition(x))
,在IEnumerable
之前添加ToList()
。
答案 1 :(得分:1)
您期望多少匹配:即您希望列表中有多少用户拥有超级用户类型?
如果您希望只有一个匹配的用户(因此匹配用户为零或多个匹配用户就是错误),那么请使用Single:
return UserList.Single(x => x.Type == (int)UserType.SuperUser).Id;
(注意如果没有一个匹配的用户,这将抛出异常;或者你可以使用SingleOrDefault然后测试null。)
如果您希望有一个或多个,并且您只想返回第一个:
return UserList.First(x => x.Type == (int)UserType.SuperUser).Id;
(注意如果没有一个匹配的用户,这将抛出异常;或者你可以使用FirstOrDefault,然后测试null。)
如果您希望有一个或多个,并且您想要返回所有匹配用户的所有ID的数组:
return UserList.Where(x => x.Type == (int)UserType.SuperUser).Select(u => u.Id).ToArray();
答案 2 :(得分:0)
只是添加已发布的好答案。
要使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();