Отсутствие значения в словаре - PullRequest
0 голосов
/ 03 июля 2018

Итак, у меня есть система enumflag, и мне нужно отфильтровать по Наркотическим, ненаркотическим, психотропным и непсихотропным из выпадающего списка. Я думал о том, чтобы поместить значения в словарь, и они просматривают пакет в списке выбора на внешнем интерфейсе, но у меня возникают проблемы при настройке словаря для регистрации «отсутствия [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"},

или что-то в этом роде. Что мне здесь не хватает? Есть ли лучший способ сделать это?

EDIT:

Является ли это правильный путь? Я знаю, как это сделать, если бы это был всего один бул, но как мне заставить обоих заполнить список? Чтобы заставить его работать, я думаю, что это сработает:

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

но как это сделать для другого набора true / false?

1 Ответ

0 голосов
/ 03 июля 2018

Похоже, вы имеете дело с flags : наркотик либо Narcotic, либо нет, либо Psychotropic; флаги могут быть объединены : мы вполне можем иметь Narcotic и Psychotropic (LSD?) или ни Psychotropic, ни Narcotic (аспирин). Если у вас есть несколько флагов (менее 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
...