C# 这里可能有lambda表达式吗?

C# 这里可能有lambda表达式吗?,c#,lambda,asp.net-core,asp.net-identity,C#,Lambda,Asp.net Core,Asp.net Identity,我正在使用ASP.Net Core Identity Framework,我需要收集我的用户不属于的所有角色。 所以,显然我可以这样做: SSUser user = await userManager.FindByIdAsync(id); var Roles = roleManager.Roles; List<string> notUserRoles = new List<string>(); foreach (var role in Roles) { if (

我正在使用ASP.Net Core Identity Framework,我需要收集我的用户不属于的所有角色。 所以,显然我可以这样做:

SSUser user = await userManager.FindByIdAsync(id);
var Roles = roleManager.Roles;
List<string> notUserRoles = new List<string>();

foreach (var role in Roles)
{
    if (!await userManager.IsInRoleAsync(user, role.Name))
    {
        notUserRoles.Add(role.Name);
    }                     
}        
SSUser user=await userManager.FindByIdAsync(id);
var Roles=rolemager.Roles;
List notUserRoles=new List();
foreach(角色中的var角色)
{
if(!await userManager.IsInRoleAsync(user,role.Name))
{
添加(role.Name);
}                     
}        
它是有效的。但是为了适应lambda表达式,你能告诉我,这是不是可以用lambda表达式来实现的?我尝试自己做了一段时间,问题是IdentityRole对象的用户属性实际上不是IdentityUser(在我的例子中是SSUser)。
可能有明显的方法,但我看不到吗?

您可以将其拆分为3个操作:

// Select all tasks 
var tasks = roles.Select(role => 
    new { 
        Task = userManager.IsInRoleAsync(user, role.Name),
        Role = role
    }).ToList();

// Wait for completion
await Task.WhenAll(tasks.Select(t => t.Task));

// Filter the result and add it to notUserRoles
notUserRoles.AddRange(tasks
    .Where (t => !t.Task.Result)
    .Select(t =>  t.Role.Name));

展示你的努力;局部变量的第一个字母不要用大写。谢谢你,卡尔顿。代码对我来说很奇怪,暂时无法使用,我将尝试找出原因。但看起来你回答了我的问题。当我决定使用foreach时,我将我的努力从列表中删除。不过谢谢你的提示,下次我会保存它们的。