问题描述
我有一个列表,它返回除导出的所有状态值之外的所有状态值,但是,我想要一个返回除导出和授权之外的所有值的列表(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))
);
这是“用户是管理员并且颜色在管理员看到的颜色列表中,或者用户不是管理员并且颜色不在只有管理员看到的颜色列表中”