inicializar el diccionario basado en la condición

inicializar el diccionario basado en la condición

La solución para iniciar el diccionario según la condición
se proporciona a continuación:

Tengo tres listas de diferentes clases (MTR, AA, EIMS ). En las tres clases tengo propiedades comunes prefixid y phasename . Según la condición, quiero agrupar las clases por Prefijo o prefijo y fase condicionar y crear diccionarios.

Intenté implementar de la siguiente manera, pero recibo un error como que no se puede determinar la expresión porque no hay una conversión implícita.

¿Cómo se puede lograr esto?

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

una vez que obtenga estos tres diccionarios, necesito obtener claves distintas de los tres diccionarios.

¿Cuál es la mejor manera de hacerlo?

El problema clave (juego de palabras intencionado) es que sus claves son de diferentes tipos.

Puedes resolver esto de 2 maneras:

Primera forma:
cambiando var a IDictionary (en el System.Collections espacio de nombres) esto pierde toda la información de tipo sobre claves y valores (y por lo tanto no tiene ningún problema con diferentes tipos de clave). Sin embargo, dependiendo de lo que haga más tarde con los diccionarios, esta pérdida total de tipos podría no ser lo que está buscando:

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

Segunda opción:
Hacer que el tipo de las claves sea el mismo, podemos hacer esto extendiendo la clave del primer caso con un valor ficticio:

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

Esto mantendrá los tipos, solo tenga en cuenta que en el primer caso todos los ShortName los valores de las claves serán "" .

Es difícil decir con seguridad si esto es lo que necesita, ya que no ha compartido mucha información sobre lo que realmente pretende hacer con estos diccionarios.

¡Espero que esto ayude y que tengas un día increíble!

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

o

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

si quieres materializarlo y repetirlo varias veces.