如何使用linq在这个场景中返回另一组int中的所有int?

时间:2017-06-05 18:55:02

标签: c# .net

我有以下情况:

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

在上面的#2中,密钥是用户ID,值是用户权限ID的int []。编写lambda函数以返回所有用户ID的好方法,这些用户ID的权限id在contentPermissions中至少匹配1个权限?

更新

这看起来是一个非常好的解决方案吗?:

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

3 个答案:

答案 0 :(得分:1)

您的代码几乎是正确的,但不是“Count()&gt; 1”应该是“Count()&gt; 0”。

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

另一个解决方案可能是:

@PostMapping(value = "${apiVersion.v_1}" + "/parameter-dates")
    public ResponseEntity createParameterDate( @RequestBody ParameterDate parameterDate){
// Some code that use parameterDate
}

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

答案 1 :(得分:0)

您最好的选择是使用Contains()功能。使用Any()

的选项略有不同
        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();

答案 2 :(得分: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;
} 

更新:

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;
}