【问题标题】:initilize dictionary based on condition根据条件初始化字典
【发布时间】:2021-08-02 15:17:06
【问题描述】:

我有三个不同类别的列表(MTR、AA、EIMS)。在所有三个类中,我都有共同的属性prefixidphasename。根据条件,我想按 Prefixprefix and Phase 条件对类进行分组并创建字典。

我尝试以下面的方式实现,但由于没有隐式转换而出现无法确定表达式的错误。

如何做到这一点?

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

获得这三个字典后,我需要从所有三个字典中获取不同的键。

最好的方法是什么。

【问题讨论】:

    标签: c# dictionary


    【解决方案1】:

    关键问题(双关语)是您的密钥类型不同。

    您可以通过两种方式解决此问题:

    第一种方式: 将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 值将是 ""

    很难确定这是否是您需要的,因为您没有分享很多关于您实际打算使用这些词典做什么的信息。

    希望这会有所帮助,祝您有美好的一天!

    【讨论】:

    • 第二个选项更适合我的 req knoop。在获得所有不同的字典键后,我必须为每个键 frpm 字典获取记录并进行一些计算。
    【解决方案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));
    

    如果你想实现它并循环几次。

    【讨论】:

    • 我认为这并不能解决核心问题,即取决于revision.IsAllowedToBorrow 标志,键具有不同的类型。
    • 如果你这样做 .ToDictionary(z => z.key.ToString() ...,那么键的类型不会不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 2012-04-27
    相关资源
    最近更新 更多