-1

如何在 if 块中使用“x”变量?如果语句为真,我想返回 x 的 Id 字段。

if (UserList.Any(x => x.Type == (int)UserType.SuperUser))
{
    return x.Id;
}
4

3 回答 3

5

您无法访问 lambda 表达式之外的“LINQ 变量”。

您要做的是获取满足条件Id的任何元素的属性。xx.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所有满足条件的元素的值,使用WhereSelectextension方法:

return UserList.Where(x => x.Type == (int)UserType.SuperUser).Select(x => x.Id);

Where(x => condition(x))如果您希望获得“正常”列表,则返回IEnumerable包含满足条件的所有元素的 an,添加ToList()before ;

于 2013-02-05T11:09:58.373 回答
1

您期望多少匹配:即您希望列表中有多少用户具有 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();
于 2013-02-05T11:14:19.073 回答
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();
于 2013-02-05T11:47:14.653 回答