LINQ:如何使用LINQ找到Array属性包含特定值的所有对象

时间:2018-02-19 21:33:20

标签: c# linq-to-objects

我一直在寻找,但找不到我需要的东西。

这种质疑可能是专门的,因为我怀疑这里有一些类似的问题。但我想我有一个具体的案例。

我有一个对象用户,其中包含属性作为权限数组。

我正在寻找以特定权限获取所有用户的正确方法。

我尝试了以下内容:

List<User> users = UserRepository.GetUser().Where(u => u.Permissions[0].Equals("MyPermission")).ToList();

这样做时,我收到一个错误:

  

“索引超出了数组的范围。”

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

使用.Any()是一种安全的方法

List<User> users = UserRepository.GetUser()
    .Where(u => u.Permissions.Any(x => x.Equals("MyPermission"))
    .ToList();

答案 1 :(得分:3)

你得到一个例外,因为你盲目地用Permissions索引[0],而没有检查它是否有任何值。

添加长度检查可以解决此问题,但它不会在初始位置之外捕获"MyPermision"

您可以使用Contains(...)

解决此问题
// Construct a MyService.UserPermissions object for searching
var targetPermission = new MyService.UserPermissions("MyPermission");
var users = UserRepository
    .GetUser()
    .Where(u => u.Permissions.Contains(targetPermission))
    .ToList();

修改:由于事实证明您正在寻找具有特定PermissionName的权限,因此您无法使用Contains。您需要使用Any代替:

var users = UserRepository
    .GetUser()
    .Where(u => u.Permissions.Any(p => p.PermissionName == "MyPermission"))
    .ToList();

答案 2 :(得分:0)

利用空传播跳过没有权限对象的用户并检查数组长度以避免超出范围的例外:

List<User> users = UserRepository.GetUser().Where(u => u.Permissions?.Length > 0 && u.Permission[0] == "MyPermission").ToList();