我目前有一个带有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;
}
答案 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();