首页 > 解决方案 > 从带有谓词的列表中删除两个或多个项目

问题描述

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

标签: c#asp.netasp.net-mvcienumerable

解决方案


在两个条件下执行任何其他类型的布尔测试的方式相同。这是计算机逻辑“所有既不是红色也不是蓝色的形状”:

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

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


推荐阅读