【问题标题】:Remove two or more itens form a list with predicate [closed]使用谓词从列表中删除两个或多个项目[关闭]
【发布时间】:2021-05-02 17:54:03
【问题描述】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2014-12-21
      • 1970-01-01
      • 2021-08-26
      相关资源
      最近更新 更多