Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将KeyValuePair的LINQ结果列表强制放入字典-缺少该概念_C#_Linq_List_Dictionary - Fatal编程技术网

C# 将KeyValuePair的LINQ结果列表强制放入字典-缺少该概念

C# 将KeyValuePair的LINQ结果列表强制放入字典-缺少该概念,c#,linq,list,dictionary,C#,Linq,List,Dictionary,我想写一篇LINQ声明: Dictionary<int, ItemBO> result = ( Dictionary<int, ItemBO> ) ( from item in originalResults where item.Value.SomeCriteria == true select item ); 这虽然不是完全违反直觉,但表明许多不必要的工作正在揭开字典的面纱,重新包装。有更好的解决办法吗?有没有我错过的概念 这虽然不是完全违反直觉,但

我想写一篇LINQ声明:

Dictionary<int, ItemBO> result = ( Dictionary<int, ItemBO> )
    ( from item in originalResults where item.Value.SomeCriteria == true
    select item );
这虽然不是完全违反直觉,但表明许多不必要的工作正在揭开字典的面纱,重新包装。有更好的解决办法吗?有没有我错过的概念

这虽然不是完全违反直觉,但表明许多不必要的工作正在揭开字典的面纱,重新包装

我不知道你说的“不必要的”工作是什么意思。要执行此操作需要大量的工作—必须对查询进行完整的计算,这包括扫描整个字典并计算每个条目的谓词。此外,还必须创建并填充一个新字典来存储结果。我认为,如果这项工作被自动转换隐藏起来,那将是一个更大的问题

真正的问题是你在倒着用字典。按键查找很快,但按值查找需要扫描字典中的所有项。如果您可以存储字典,以便用于筛选的值是键,那么您将能够进行更快的查找,并使用更干净的语法。

linq查询的“真实”结果不是字典,因此您无法自然地强制转换它。
结果是IQueryable,因此您必须显式转换它。

您缺少的概念是,您的代码表示对现有词典的查询,其结果将是一个
IEnumerable
。您的原始代码所期望的是有人定义了将
IEnumerable
转换为
Dictionary
。本质上,它们让您能够定义自己需要的任何转换,因为您有
到字典
扩展方法,它允许您确定一个键、一个值等。

我将再次尝试您缺少的真正“键”概念是什么

如果我大胆猜测的话,我会说我认为你把一本
字典
想象成它的内容的同义词。你有一堆键值对,这就是字典,对吧?这就是你遗漏了一个重要细节的地方。虽然您当然可以使用简单的
KeyValuePair[]
来实现
IDictionary
,但这将失去一个最大的好处,即首先使用字典类型:按键快速查找

即使您对数组进行排序,并使用二进制搜索来定位键(顺便说一句,这会导致所有插入的成本),您也无法和
字典使用的方法竞争。这种实现不是简单的没有特定结构的“一串键值对”;结构就是这种类型的一切。因此,从一堆键值对(没有结构的内容)直接快速转换到字典(具有非常特殊的结构)是不可能的,因为类型的结构布局确实决定了转换在C中是否可行(您必须仅遵守继承,以及一些内置的,可能是用户定义的类型转换)


这样想吧:字典是容器,不是内容,对吗?所以如果我有一罐不同类型的饼干,我想取出所有的巧克力曲奇,我可能会把每一个都提取出来,放在一小堆里,然后说:“这是一罐巧克力曲奇,对吗?”不,我只取出了饼干;我有的是一堆,不是一罐。如果我想要一罐巧克力饼干,我就必须把它们放进一罐,这需要做一些非零的工作。

我不认为我是在倒退使用字典,但现在你让我重新考虑这个模块的整体架构。(我继承了它。它确实需要重写,这可能是滴定点。)@Bob Kaufman:在你的代码中,可能还有其他地方使用了字典“正确”方式和这一个地方是例外。如果是这样,它可能是好的,让它原样,并接受这一个操作是缓慢的,特别是如果它被称为不频繁。但如果这是典型的方式,你使用字典,我会说,这是一个好主意,考虑是否另一种设计更适合。
Dictionary<int, ItemBO> result = 
    ( from item in originalResults where item.Value.SomeCriteria == true
    select item.Value ).ToDictionary( GetItemKey );