如何在if块中使用"x"变量?若语句为true,我想返回x的Id字段。
if (UserList.Any(x => x.Type == (int)UserType.SuperUser))
{
return x.Id;
}
您不能访问lambda表达式之外的"LINQ变量"。
要做的是获得满足条件x.Type == (int)UserType.SuperUser
的任何元素x
的Id
属性。
在这种情况下,请将Any()
替换为FirstOrDefault()
。
var item = UserList.FirstOrDefault(x => x.Type == (int)UserType.SuperUser);
if(item != null)
return item.Id;
CCD_ 6返回满足条件的第一个元素,如果没有元素满足条件则返回CCD_。
如果要获得满足条件的所有元素的Id
值,请使用Where
和Select
扩展方法:
return UserList.Where(x => x.Type == (int)UserType.SuperUser).Select(x => x.Id);
Where(x => condition(x))
返回一个IEnumerable
,其中包含满足条件的所有元素。如果您希望获得"正常"列表,请在;
之前添加ToList()
。
您希望有多少匹配:即您希望列表中有多少用户具有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,然后测试null。)
如果您希望有一个或多个,并且希望返回所有匹配用户的所有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;
您可以对userId使用count方法来确定是否有人满足您的条件。
既然你正在返回id,我猜id是一个int,你无论如何都必须返回一些东西,我猜如果没有,你会返回0,你可以使用:
return UserList.Where(x => x.Type == UserType.SuperUser).Select(x => x.Id).FirstOrDefault();