字典中没有值

时间:2018-07-03 14:08:39

标签: c# dictionary enum-flags enumdropdownlistfor

所以我有一个枚举系统,我需要在下拉列表中按麻醉,非麻醉,精神病和非精神病进行过滤。我的想法是将值放在字典中,并将它们的viewbag放入前端的选择列表中,但是我在配置字典以注册“ [var]的缺席”时遇到困难

如果我的字典的结构如下:

private readonly Dictionary<int, string> _medicationDetails = new Dictionary<int, string>
        {
            {(int)PersonMedicationDescription.MedicationTags.NarcoticDrug, "Narcotic"},
            {(int)PersonMedicationDescription.MedicationTags.PsychotropicDrug, "Psychotropic"}
        };

我希望能够做到:

{(int)!PersonMedicationDescription.MedicationTags.NarcoticDrug, "non-Narcotic"},

或类似的内容。我在这里想念什么?有没有更好的方法可以做到这一点?

编辑:

是正确的选择。如果只是一个布尔值,我知道该怎么做,但是如何同时填充两个列表?要让一个人上班,我认为这会起作用:

ViewBag.IsNarcoticOptions = new[]
            {
                true,
                false                
            }.ToSelectList(b => b.ToString(), b => b.ToString("Narcotic", "Non Narcotic"));

var isNarcotic = filters.IsNarcotic;
            if (isNarcotic.HasValue)
            {
                query = isNarcotic.Value
                    ? query.Where(rdq => (rdq.MedicationFlags & (int)PersonMedicationDescription.MedicationTags.NarcoticDrug) == (int)PersonMedicationDescription.MedicationTags.NarcoticDrug)
                    : query.Where(rdq => (rdq.MedicationFlags & (int)PersonMedicationDescription.MedicationTags.NarcoticDrug) == 0);
            }    

但是对于另一组正确/错误该怎么做呢?

1 个答案:

答案 0 :(得分:0)

您似乎正在处理 flags :毒品是Narcotic还是不是Psychotropic?标记可以组合: 我们很可能拥有Narcotic PsychotropicLSD?)或PsychotropicNarcotic(阿司匹林)都没有。如果您有几个标志(少于64个),则可以尝试将枚举设计为Flags并摆脱字典

[Flags]
public enum MedicationTags {
  None = 0,
  Narcotic = 1,
  Psychotropic = 1 << 1,
  // SomeOtherKind = 1 << n // where n = 2, 3, 4 etc.
}

然后让我们为枚举实现扩展方法 Description

public static class MedicationTagsExtensions {
  public static String Description(this MedicationTags value) {
    return string.Join(", ",
      (value.HasFlag(MedicationTags.Narcotic) ? "" : "non-") + "Narcotic",
      (value.HasFlag(MedicationTags.Psychotropic) ? "" : "non-") + "Psychotropic"
    );
  }
}

所以,当有毒品时:

  // Morphine is narcotic only
  MedicationTags morphine = MedicationTags.Narcotic; 
  // LSD is both narcotic and psychotropic
  MedicationTags lsd = MedicationTags.Narcotic | MedicationTags.Psychotropic; 
  // Good old aspirin is neither narcotic nor psychotropic
  MedicationTags aspirin = MedicationTags.None; 

您可以轻松获得说明

  Console.WriteLine(aspirin.Description());

结果:

  non-Narcotic, non-Psychotropic