将KeyValuePair的LINQ结果列表强制转换为字典 - 缺少概念

Bob*_*man 6 c# linq dictionary list

我想写这个LINQ语句:

Dictionary<int, ItemBO> result = ( Dictionary<int, ItemBO> )
    ( from item in originalResults where item.Value.SomeCriteria == true
    select item );
Run Code Online (Sandbox Code Playgroud)

originalResults是类型的Dictionary<int, ItemBO>.

我得到的item是类型KeyValuePair<int, ItemBO>,但是会认为从该类型的列表到该类型的词典的转换将是......呃......"自然".

相反,为了让编译器闭嘴,我需要写这个:

Dictionary<int, ItemBO> result = 
    ( from item in originalResults where item.Value.SomeCriteria == true
    select item.Value ).ToDictionary( GetItemKey );
Run Code Online (Sandbox Code Playgroud)

虽然并非完全违反直觉,但它表明,正在进行大量不必要的工作,打包和重新打包字典.有更好的解决方案吗?有没有我错过的概念?

Mar*_*ers 4

这虽然并不完全违反直觉,但表明许多不必要的拆包和重新包装字典的工作正在幕后进行。

我不确定你所说的“不必要的”工作是什么意思。要执行此操作需要大量工作 - 必须全面评估您的查询,这涉及扫描整个字典并评估每个条目的谓词。此外,还必须创建并填充一个新字典来存储结果。我认为如果这项工作被自动转换隐藏的话,问题就更大了。

真正的问题是你用错了字典。按键查找速度很快,但按值查找需要扫描字典中的所有项目。如果您可以存储字典,以便用于过滤的值是关键,那么您将能够使用更清晰的语法进行更快的查找。