инициализируйте словарь на основе условия

#c# #dictionary

Вопрос:

У меня есть три списка разных классов(MTR, AA, EIMS). Во всех трех классах у меня есть общие свойства prefixid и phasename . На основе условия я хочу сгруппировать классы по префиксу или префиксу и условию фазы и создать словари.

Я попытался реализовать приведенный ниже способ, но я получаю ошибку, как будто выражение не может быть определено, потому что нет неявного преобразования.

Как этого можно достичь?

 var mtrDct = revision.IsAllowToBorrow ?
 mtrubilledTrxs.Where(x => x.AgrmntRevId == revId).GroupBy(x => x.Prefix.Id).ToDictionary(z => z.Key, z => z.ToList()) :
 mtrubilledTrxs.Where(x => x.AgrmntRevId == revId).GroupBy(x => new { x.Prefix.Id, x.Phase.ShortName }).ToDictionary(z => z.Key, z => z.ToList());

var eimsDct = revision.IsAllowToBorrow ?
 evunbilledTrxs.Where(x => x.AgrmntRevId == revId).GroupBy(x => x.Prefix.Id).ToDictionary(z => z.Key, z => z.ToList()) :
 evunbilledTrxs.Where(x => x.AgrmntRevId == revId).GroupBy(x => new { x.Prefix.Id, x.Phase }).ToDictionary(z => z.Key, z => z.ToList());

var aaDct = revision.IsAllowToBorrow ?
 aaunbilledTrxs.Where(x => x.AgrmntRevId == revId).GroupBy(x => x.Prefix.Id).ToDictionary(z => z.Key, z => z.ToList()) :
 aaunbilledTrxs.Where(x => x.AgrmntRevId == revId).GroupBy(x => new { x.Prefix.Id, x.Phase.ShortName }).ToDictionary(z => z.Key, z => z.ToList());
 

как только я получу эти три словаря, мне нужно будет получить разные ключи от всех трех словарей.

Каков наилучший способ сделать это?

Ответ №1:

Ключевая проблема (каламбур) заключается в том, что ваши ключи разных типов.

Вы можете решить эту проблему 2 способами:

Первый способ: изменение var на IDictionary System.Collections пространстве имен) при этом теряется вся информация о типах ключей и значений (и поэтому не возникает проблем с различными типами ключей). Однако, в зависимости от того, что вы позже сделаете со словарями, эта полная потеря типов может оказаться не тем, что вы ищете:

 IDictionary mtrDct = revision.IsAllowToBorrow ?
 mtrubilledTrxs.Where(x => x.AgrmntRevId == revId).GroupBy(x => x.Prefix.Id).ToDictionary(z => z.Key, z => z.ToList()) :
 mtrubilledTrxs.Where(x => x.AgrmntRevId == revId).GroupBy(x => new { x.Prefix.Id, x.Phase.ShortName }).ToDictionary(z => z.Key, z => z.ToList());
 

Второй вариант:
Сделайте тип ключей одинаковым, мы можем сделать это, расширив ключ первого случая фиктивным значением:

 var mtrDct = revision.IsAllowToBorrow ?
 mtrubilledTrxs.Where(x => x.AgrmntRevId == revId).GroupBy(x => new { x.Prefix.Id, ShortName = "" }).ToDictionary(z => z.Key, z => z.ToList()) :
 mtrubilledTrxs.Where(x => x.AgrmntRevId == revId).GroupBy(x => new { x.Prefix.Id, x.Phase.ShortName }).ToDictionary(z => z.Key, z => z.ToList());
 

Это сохранит типы, просто имейте в виду, что в первом случае все ShortName значения ключей будут "" одинаковыми .

Трудно сказать наверняка, нужно ли вам это, так как вы не поделились большим количеством информации о том, что вы на самом деле собираетесь делать с этими словарями.

Надеюсь, это поможет и хорошего вам дня!

Комментарии:

1. второй вариант лучше подходит для моего req knoop. после получения всех отдельных ключей dict я должен получить записи для каждого ключа frpm dict и выполнить некоторые вычисления.

Ответ №2:

 var keys = (mtrDct.Keys.Union(eimsDct.Keys).Union(aaDct.Keys)).Distinct();
 

или

 var keys =new HashSet<string>(mtrDct.Keys.Union(eimsDct.Keys).Union(aaDct.Keys));
 

если вы хотите материализовать его и повторить несколько раз.

Комментарии:

1. Я не думаю, что это решает основную проблему, которая заключается в том, что в зависимости от revision.IsAllowedToBorrow флага ключи имеют разные типы.

2. Если ты это сделаешь . ToDictionary(z => z.ключ. toString() …, тогда ключи не будут другого типа.