c# - 从带有谓词的列表中删除两个或多个项目
问题描述
我有一个返回除导出的状态值之外的所有状态值的列表,但是,我想要一个返回除导出值和授权值之外的所有值的列表(2 状态)
// Getting all status except the exported one
// GetStarusApontamento is a IEnumerable
var listStatus = this._apontamentoAppService.GetStatusApontamento().Where(x=>x != StatusApontamento.Exported).ToList();
我将如何做类似的例子:
var listStatus = this._apontamentoAppService.GetStatusApontamento().Where(x=>x != StatusApontamento.Exported && StatusApontamento.authorized).ToList();
还有一个条件是我从列表中删除某个项目,例如,如果此人的个人资料是管理员
if (PerfildeAprovacao.PerfilDeValidacaoDeStatus.Equals("Administrador"))
{
listStatus.RemoveAll(status => status != StatusApontamento.authorized);
}
解决方案
在两个条件下执行任何其他类型的布尔测试的方式相同。这是计算机逻辑“所有既不是红色也不是蓝色的形状”:
shape.Color != Red && shape.Color != Blue
或者
!(shape.Color == Color.Red || shape.Color == Color.Blue)
从心理学的角度来看,人类倾向于与第一种形式作斗争,因为他们说“给我所有不是红色或蓝色的形状”(更接近于第二种形式)而不是“给我所有不是红色和形状的形状”不是蓝色的”
即使在两件事上,使用你想要/不想要的东西的集合可能更具可读性:
var want = new List<Color> { Color.Red, Color.Blue };
shapes.Where(s => want.Contains(s.Color));
var dontWant = List<Color> { Color.Red, Color.Blue };
shapes.Where(s => !dontWant.Contains(s.Color));
这种方式更容易扩展到更多,尽管我必须说我发现阅读“积极”想要而不是“双重否定”不想要形式更容易。在您的脑海中转变逻辑可能也很重要,因此您正在寻找“我想要的颜色列表包含形状颜色的形状”
关于以不同的方式对待管理员,有很多方法可以做到这一点,尽管争取一些可读的东西。也许:
var adminsSee = new List<Color> { Color.Red, Color.Blue };
shapes.Where(s =>
(user.IsAdmin && adminsSee.Contains(s.Color)) ||
(!user.IsAdmin && !adminsSee.Contains(s.Color))
);
这是“用户是管理员,颜色在管理员看到的颜色列表中,或者用户不是管理员并且颜色不在只有管理员看到的颜色列表中”
推荐阅读
- assembly - 过早重置堆栈指针?令人困惑的汇编代码
- reactjs - Uncaught (in promise) IntegrationError: Missing value for Stripe(): apiKey 应该是一个字符串。仅在部署到 vercel 但在本地工作正常时
- java - 在 jsp 和 struts 中创建下拉菜单时出错
- deployment - SqlPackage 不部署引用的 DAC 包
- wordpress - 无法以我的自定义格式比较 ACF 字段日期
- javascript - 即使在 React with Firebase Realtime DB 中返回了一个值,为什么我会得到“未定义”?
- php - 将十进制值从 JQuery Ajax 发送到 PHP 会导致不需要的舍入
- python - Ubuntu python 3.7 到 3.8 更新替代方案
- node.js - Prisma:错误:P1017 服务器已关闭连接
- node.js - 为什么我的猫鼬查询在此代码中返回未定义?