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
Vb.net 如何在.NET2.0中按值对SortedDictionary排序?_Vb.net_Linq_Sorting_.net 2.0_Sorteddictionary - Fatal编程技术网

Vb.net 如何在.NET2.0中按值对SortedDictionary排序?

Vb.net 如何在.NET2.0中按值对SortedDictionary排序?,vb.net,linq,sorting,.net-2.0,sorteddictionary,Vb.net,Linq,Sorting,.net 2.0,Sorteddictionary,我有一本分类词典: 将myFilterItems设置为SortedDictionary(字符串的FilterItem) myFilterItems=新的SortedDictionary(字符串的,FilterItem)(StringComparer.CurrentCultureIgnoreCase) FilterItem类的定义如下: 私有类过滤器项 以排序为对象的公共价值 Public被选为Boolean 以布尔值形式发送公共数据=False 末级 我需要枚举按FilterItem.Val

我有一本分类词典:

将myFilterItems设置为SortedDictionary(字符串的FilterItem)
myFilterItems=新的SortedDictionary(字符串的,FilterItem)(StringComparer.CurrentCultureIgnoreCase)
FilterItem类的定义如下:

私有类过滤器项
以排序为对象的公共价值
Public被选为Boolean
以布尔值形式发送公共数据=False
末级
我需要枚举按FilterItem.ValueToSort属性排序的SortedDictionary。使用LINQ,很容易做到-我们得到相应的IEnumerable,然后分别使用:

将mySortedValueList设置为IEnumerable(属于KeyValuePair(属于字符串、FilterItem))
mySortedValueList=从myFilterItems中的条目按条目的顺序。Value.ValueToSort升序
对于mySortedValueList中作为KeyValuePair(字符串的FilterItem)的每个条目
' ...
下一个

如何在.NET2.0中有效地做到这一点?

我按照JonSkeet的建议,使用列表重新编写了代码。从测试中可以看出,我的性能与LINQ查询相同,甚至可以获得5-10%的增益。新版本的代码如下所示:

Dim mySortedValueList作为新列表(KeyValuePair(String,FilterItem)的)(myFilterItems)
如果iArr iGAFMValueType.Text,则
排序(CompareFilterItemsByValuesToSort的地址)
如果结束
私有共享函数CompareFilterItemsByValuesToSort(ByVal itemX作为KeyValuePair(字符串,FilterItem的),ByVal itemY作为KeyValuePair(字符串,FilterItem的))作为整数
将myValueX设置为IComparable=TryCast(itemX.Value.ValueToSort,IComparable)
将myValueY设置为IComparable=TryCast(itemY.Value.ValueToSort,IComparable)
如果(myValueX为Nothing),则
如果(myValueY什么都不是)那么
返回0
如果结束
返回-1
如果结束
如果(myValueY什么都不是)那么
返回1
如果结束
Dim myTypeX As Type=myValueX.GetType()
Dim myTypeY As Type=myValueY.GetType()
如果(myTypeX myTypeY)那么
返回字符串.CompareOrdinal(myTypeX.Name,myTypeY.Name)
如果结束
返回myValueX.CompareTo(myValueY)
端函数
然而,在使用这种比较算法时,我发现我无法比较某些数值类型的值——尽管它们可以比较(例如,SByte和Double值)。顺便说一句,在这种情况下,原始LINQ查询也会失败。但在这个问题上,这是另一个故事:


基本上,您不使用SortedDictionary。SortedDictionary的定义是按键排序,而不是按值排序。@JonSkeet,我很乐意使用另一种集合,但在我要求的任务之前,我正在用我的SortedDictionary按键排序做很多工作。我使用SortedDictionary.ContainsKey()方法在枚举100000多行原始数据时,分析字典中是否已经有键。这并不意味着SortedDictionary是正确的答案。如果需要,可以将键/值对复制到列表中,然后使用自定义比较器对列表进行排序。(顺便问一句,你真的与.NET 2.0绑定了吗?如果没有其他东西的话,我会非常担心安全更新……请注意,也有在.NET 2.0上工作的LINQ to Objects实现…)是的,我真的与.NET 2.0绑定了。现有代码适用于.NET3.5+,但现在我们需要使其适用于.NET2.0,因为我们不允许在这些pc上升级到.NET3.5。然后我建议您使用我以前建议的列表方法。但我会非常担心那些被告知使用旧的、可能不安全的软件的个人电脑:(