使用LINQ变量脱离上下文

时间:2013-02-05 11:08:14

标签: c# linq

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

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

3 个答案:

答案 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值,请使用WhereSelect扩展方法:

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();