2017-06-05 35 views
0

我有以下情形:如何使用linq返回此场景的另一个整数集中的所有整数?

1. int[] contentPermissions 
2. Dictionary<int, int[]> userPermssions 

在上述#2,密钥是用户ID和值是用户许可ID的一个int []。编写一个lambda函数以返回所有具有与contentPermissions中的至少一个权限相匹配的权限ID的用户标识是什么方法?

UPDATE

这是否看起来是一个不错的解决方案?:

var userIdsWithPermissions = userPermissions.Where(
      x => x.Value.Intersect(contentPermissions).Count() > 1) 
      .Select(x => x.Key).ToArray(); 
+0

你告诉我们*它是否正常工作,如果不正常,那么它不应该如它应该那样工作。 – Servy

+0

你的回答比我的更有意义。对我来说,一点点的D'Oh时刻。 – brhardwick

回答

-1

您最好的选择是使用含有()函数。使用稍微不同的选项任何()

 List<int> contentPermissions = new List<int>(); 
     Dictionary<int, List<int>> userPermssions = new Dictionary<int, List<int>>(); 

     var A = userPermssions.Where(m => m.Value.Any(n => contentPermissions.Contains(n))).Select(m => m.Key).ToList(); 
+0

这是为什么downvoted?我有确切的解决方案作为derloopkat – brhardwick

+0

不知道为什么。您使用管道,因此可能会出现性能问题。但是你的代码完成这项工作。我的回答也被低估了。我会努力提高你的成绩,因为就我所见,这是正确的。 – derloopkat

0

您可以使用此方法:

public int[] GetUserIDArrayByPermission(int permission) 
{ 
    var dicUserPermission=userPermssions.Where(i => i.Value.Contains(permission)); 
int[] userIDArray=dicUserPermission.Select(p => p.Key).ToArray(); 
return userIDArray; 
} 

UPDATE:

public int[] GetUserIDArrayByContentPermissions() 
{    
    var dicUserPermission = userPermssions.Where(i => i.Value.Count(p=>contentPermissions.Contains(p))>0).ToList(); 
    int[] userIDArray = dicUserPermission.Select(p => p.Key).ToArray(); 
    return userIDArray; 
} 
+0

OP要求提供一个代码,用于“返回具有与contentPermissions中的至少一个权限相匹配的权限ID的所有用户标识”。此代码返回具有作为参数提供的一个权限的所有用户ID。这不是被问到的。 – derloopkat

+0

@derloopkat,是的,这是我的错,并写了新的方法 – amin

1

你的代码几乎是正确的,但不是“伯爵() > 1“应该是”Count()> 0“。

var userIdsWithPermissions = userPermssions.Where(
        x => x.Value.Intersect(contentPermissions).Count() > 0) 
        .Select(x => x.Key).ToArray(); 

另一种解决方案可以是这样的:

var userIdsWithPermissions = from u in userPermssions 
          where contentPermissions.Any(p => u.Value.Contains(p)) 
          select u; 

两者产生相同的输出。最后一个更快,仅需4 ms,而Intersect解决方案只需22 ms。

相关问题