[英]LINQ: How do I find all the objects whose Array property contains a particular value using LINQ
我已经搜寻了一段时间,但找不到确切的需求。
因为我怀疑这里已经存在一些类似的问题,所以可能会提出这个问题。 但我认为我有一个具体案例。
我有一个对象User,其中包含属性为“权限数组”。
我正在寻找正确的方式来获取具有特定权限的所有用户。
我尝试了以下方法:
List<User> users = UserRepository.GetUser().Where(u => u.Permissions[0].Equals("MyPermission")).ToList();
这样做时,出现错误:
“指数数组的边界之外。”
正确的做法是什么?
使用.Any()是一种安全的方法
List<User> users = UserRepository.GetUser()
.Where(u => u.Permissions.Any(x => x.Equals("MyPermission"))
.ToList();
之所以会出现异常,是因为您用[0]
盲目索引了Permissions
,而没有检查它是否有任何值。
添加长度检查可以解决此问题,但不会在初始位置之外捕获"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();
利用空传播来跳过没有权限对象的用户,并检查数组长度以避免超出范围的异常:
List<User> users = UserRepository.GetUser().Where(u => u.Permissions?.Length > 0 && u.Permission[0] == "MyPermission").ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.