繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM