#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() …, тогда ключи не будут другого типа.