【问题标题】:Four nullable boolean multiple choice checkboxs.四个可为空的布尔多选复选框。
【发布时间】:2016-05-27 11:25:46
【问题描述】:

我有一点问题。我是一名新开发人员,我对我的产品有“年龄标准”的看法。

这些选项是:“ 45”。

我需要处理的 json 看起来是这样的:

"age": {
        "lessThan24": true,
        "between24And35": true,
        "between35And45": true,
        "moreThan45": true
        }

我的视图模型:

public class AgeCriterionViewModel
{
    public bool? LessThan24 { get; set; }
    public bool? Between24And35 { get; set; }
    public bool? Between35And45 { get; set; }
    public bool? MoreThan45 { get; set; }
}

还有我的领域模型:

public class AgeCriterion
{
    public int? From { get; set; }
    public int? To { get; set; }
}

所以这是我的问题。我需要将视图模型映射到域模型。但是这些布尔值是可以为空的,因此它们可以为空、假或真。 OLSO 它可以是多选的。因此,这些选项可能是“小于 24”和“介于 35 和 45 之间”或全部或没有。

我正在考虑构建一些糟糕的 BIG IF 构造。但是我如何检查所有选项?有什么好办法吗?

我现在有这个:

       if (age == null)
            return null;
        AgeCriterion criterion = new AgeCriterion();

        if (age.LessThan24.HasValue)
        {
            if (age.LessThan24.Value)
            {
                criterion.From = 0;
                criterion.To = 24;
            }
        }

【问题讨论】:

  • 将其分离出来,创建将可空布尔值转换为布尔值作为标准并重用的方法。至于一个好方法,不是我知道的,你必须在某处做 if 语句,但要让它可以重用代码以在未来拯救你自己
  • 如果我检查LessThan24 & Between24And35,你如何管理标准?
  • 你可以创建枚举并使用像var result = AgeCriterion.BelowTwentyFive | AgeCriterion.ThirtyToFourtyFive;这样的位掩码,检查这个:stackoverflow.com/questions/1030090/…
  • @ThomasAyoub 在这种情况下,我会假设它是 0 到 35。一个更好的问题是,如果唯一选择的值是 LessThan24MoreThan45,该怎么办?在这种情况下,您似乎需要多个 AgeCriterion 来表示模型。
  • @juharr 没错。单个AgeCriterion 不能代表所有可能的组合,我们假设与or 组合。我还假设null 表示do not apply,但不清楚应该如何处理false 值?例如,LessThan24 == false 可以被视为>= 24

标签: c#


【解决方案1】:

您可以创建枚举并使用位掩码:

[Flags]
public enum AgeCriterion
{
   NotSpecified = 0,
   BelowTwentyFour = 1,
   TwentyToThirtyFive = 2,
   ThirtyToFourtyFive = 4,
   MoreThanFourtyFive = 8,
}

public class AgeCriterion
{
    public AgeCriterion Age { get; set; }
}

像这样将视图模型映射到这个枚举:

  var criterion = new AgeCriterion();

  if (age == null)
        return criterion; // fill free to return null if it better suit your needs

  AgeCriterion age;

  age  = age.LessThan24 == true ? age | AgeCriterion.BelowTwentyFour : age;

  age  = age.Between24And35 == true ? age | AgeCriterion.TwentyToThirtyFive : age;

  age  = age.Between35And45 == true ? age | AgeCriterion.ThirtyToFourtyFive : age;

  age  = age.MoreThan45 == true ? age | AgeCriterion.MoreThanFourtyFive : age;

  criterion.Age = age;

  return criterion;

附: 要检查代码中的特定标准,您可以这样做:


为 24 至 35 岁的人 45 岁以上的人做点事(我不会说这对我来说很有意义,但仍然)

if(criterion.Age == AgeCriterion.TwentyToThirtyFive &  criterion.Age == AgeCriterion.MoreThanFourtyFive)

为 24 至 35 岁的人 45 岁以上的人做某事


if(criterion.Age == AgeCriterion.TwentyToThirtyFive |  criterion.Age == AgeCriterion.MoreThanFourtyFive)

【讨论】:

【解决方案2】:

您可以使用?? Operator (C# Reference) 来最小化您的 if/else。

if (age.LessThan24 ?? false)
{
    criterion.From = 0;
    criterion.To = 24;
}
else if (age.Between24And35 ?? false)
{
    criterion.From = 24;
    criterion.To = 35;
}
// And so on

它的作用是:
如果age.LessThan24null 而不是使用false,如果不使用它的值:

if (age.LessThan24 != null)
{
    if(age.LessThan24.Value)
    {
        // ....

    }
}

【讨论】:

  • 不需要特殊的运算符,age.LessThan24 == true 也会这样做,但这不是主要问题。在某些情况下,这个问题不清楚且无法解决。
猜你喜欢
  • 2011-10-14
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多