断章取义地使用LINQ变量



如何在if块中使用"x"变量?若语句为true,我想返回x的Id字段。

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

您不能访问lambda表达式之外的"LINQ变量"。

要做的是获得满足条件x.Type == (int)UserType.SuperUser的任何元素xId属性。

在这种情况下,请将Any()替换为FirstOrDefault()

var item = UserList.FirstOrDefault(x => x.Type == (int)UserType.SuperUser);
if(item != null)
    return item.Id;

CCD_ 6返回满足条件的第一个元素,如果没有元素满足条件则返回CCD_。

如果要获得满足条件的所有元素的Id值,请使用WhereSelect扩展方法:

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

相关内容

  • 没有找到相关文章

最新更新