从Dictionary C#中检索值的改进方法

时间:2017-09-18 13:49:26

标签: c# dictionary

我目前有一个带有int键的字典,值是一个名为MachinePart的类的实例。

关键是MachinePart所属的机器部件类型很重要。例如,如果密钥在0-99之间,则机器部件属于称为“自由运动”的类别。如果密钥在100-199之间,则机器部件属于另一个类别,依此类推......

因此,有一个方法可以从字典中检索某个类别。澄清返回键在一定范围内的机器零件清单。

以下是我目前检索自由运动部件的代码。它工作正常,但我想知道是否有更好的写入方式,而不是必须有一个循环,迭代99次。

 public static List<MachinePart> getFreeMovementParts(Dictionary<int, MachinePart> iMachineParts)
    {
        List<MachinePart> temp = new List<MachinePart>();
        for (int i = 0; i < 99; i++)
        {
            MachinePart t;
            if (iMachineParts.TryGetValue(i, out t))
            {
                temp.Add(t);
            }
        }
        return temp;

    }

3 个答案:

答案 0 :(得分:1)

您可以使用Linq选择值,如下所示:

var freeMovementParts = iMachineParts.Where(it => it.Key >= 0 && it.Key <= 99)
                                     .Select(it => it.Value)
                                     .ToList();

但正如评论中所建议的那样,最好考虑实施的替代数据结构。另外值得注意的是,如果字典包含大量项目,迭代键将导致性能不佳,并且您将失去使用字典的性能优势。

答案 1 :(得分:0)

如果您想使用Linq-ify代码,您可以执行以下操作:

    public static List<MachinePart> getFreeMovementParts(Dictionary<int, MachinePart> iMachineParts)
    {
        return Enumerable.Range(0, 99)
            .Select(i => { iMachineParts.TryGetValue(i, out var mp); return mp; })
            .Where(mp => mp != null)
            .ToList();
    }

它没有解决评论中提到的问题,不同的数据结构可能仍然更合适,以上几乎只是为了好玩。

这种方法的性能与“枚举所有密钥”方法的性能 - 它类似于DB索引,在小型数据集上,进行全扫描(枚举所有密钥)通常更便宜。但是当你只需要一个大字典中的一小部分项目时 - 根据已知的密钥范围进行项目查找会更便宜。

答案 2 :(得分:0)

    var r = from part in iMachineParts
                where part.Key >= 0 && part.Key <= 99
                select part.Value;

        return r.ToList();