从带有谓词的列表中删除两个或多个 itens

问题描述

我有一个列表,它返回除导出的所有状态值之外的所有状态值,但是,我想要一个返回除导出和授权之外的所有值的列表(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))
);

这是“用户是管理员并且颜色在管理员看到的颜色列表中,或者用户不是管理员并且颜色不在只有管理员看到的颜色列表中”