使用谓词从列表中删除两个或多个项目

Remove two or more itens form a list with predicate

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

还有一个条件是我从列表中删除某个项目,例如,如果此人的个人资料是 Admin

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)

从心理学的角度来看,人类倾向于与第一种形式作斗争,因为他们说“给我所有不是红色或蓝色的形状”(更接近第二种形式)而不是“给我所有不是红色或蓝色的形状” 't 红色和非蓝色的形状


即使在两件事上,使用您do/don不想要的东西的集合可能更具可读性:

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))
);

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