我经常需要按值排序字典,包括键和值.例如,我有一个单词的散列和各自的频率,我想按频率排序.
有一个SortedList对单个值(比如频率)有好处,我想将它映射回单词.
SortedDictionary按键排序,而不是值.有些人诉诸于自定义课程,但是有更清洁的方法吗?
想象一下代码:
public class obj
{
// elided
}
public static Dictionary<string, obj> dict = new Dictionary<string, obj>();
Run Code Online (Sandbox Code Playgroud)
方法1
public static obj FromDict1(string name)
{
if (dict.ContainsKey(name))
{
return dict[name];
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
方法2
public static obj FromDict2(string name)
{
try
{
return dict[name];
}
catch (KeyNotFoundException)
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我很好奇这两个函数的性能是否存在差异,因为第一个函数应该比第二个函数更低 - 假设它需要在字典包含值时检查两次,而第二个函数确实只需要访问字典曾经但是WOW,它实际上是相反的:
循环1 000 000个值(现有10万个,不存在90 000个):
第一个功能:306毫秒
第二功能:20483毫秒
这是为什么?
编辑:你可以在下面这个问题的评论中注意到,如果有0个非现有密钥,第二个函数的性能实际上略好于第一个函数.但是,一旦存在至少一个或多个非现有密钥,则第二个密钥的性能会迅速下降.
从.Net 2.0泛型字典中获取密钥的值很容易:
Dictionary<int, string> greek = new Dictionary<int, string>();
greek.Add(1, "Alpha");
greek.Add(2, "Beta");
string secondGreek = greek[2]; // Beta
Run Code Online (Sandbox Code Playgroud)
但有没有一种简单的方法来获取价值的关键?
int[] betaKeys = greek.WhatDoIPutHere("Beta"); // expecting single 2
Run Code Online (Sandbox Code Playgroud) 我想以下列方式在单词中存储单词:
我可以逐字逐句地获取文字:dict["SomeWord"]- > 123并逐字逐句地获取:dict[123]- >"SomeWord"
这是真的吗?当然,一个办法做到这一点是两点字典:Dictionary<string,int>和Dictionary<int,string>,但有另一种方式?
我有一个低脑波日...有没有人知道一种快速而优雅的方式来转换一个字典,以便键成为价值,反之亦然?
例:
var originalDictionary = new Dictionary<int, string>() {
{1, "One"}, {2, "Two"}, {3, "Three"}
};
Run Code Online (Sandbox Code Playgroud)
变
var newDictionary = new Dictionary<string, int>();
// contents:
// {
// {"One", 1}, {"Two", 2}, {"Three", 3}
// };
Run Code Online (Sandbox Code Playgroud) 我有两组对象,在某些情况下,第一组将用作另一组的键,而在其他情况下,第二组将用作第一组的键.此外,两个列表中都不得有重复项.
什么是一个好的数据结构用于此?我应该使用两个字典还是有更聪明的方法?
基于这个问题,是否有一个简单的解决方案,可以使用多键字典,其中任何一个键都可以用来识别值?
即.
MultikeyDictionary<TKey1, TKey2, TValue> foo;
foo.Add(key1, key2, value);
myValue = foo[key1];
// value == myValue
foo.Remove(key2);
myValue = foo[key1]; // invalid, Exception or null returned
Run Code Online (Sandbox Code Playgroud) 我正在写一个双向字典类,但我想确保两个泛型类型不是同一类型,原因有两个.
首先,我希望它IDictionary在两个方向上实现接口,但是
public class BijectiveDictionary<TKey, TValue>
: IDictionary<TKey, TValue>, IDictionary<TValue, TKey>
Run Code Online (Sandbox Code Playgroud)
给我"'BijectiveDictionary <TKey,TValue>'不能同时实现'IDictionary <TKey,TValue>'和'IDictionary <TValue,TKey>'因为它们可能统一某些类型参数替换"(这是可以理解的,但不可取的.)
其次,如果两种类型相同,我想编写一个优化的解决方案.
public class BijectiveDictionary<TKey, TValue>
: IDictionary<TKey, TValue> where TValue : TKey
{
// Optimized solution
}
public class BijectiveDictionary<TKey, TValue>
: IDictionary<TKey, TValue>, IDictionary<TValue, TKey> where TValue : !TKey
{
// Standard solution
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?
如果没有,我可以考虑不实施IDictionary,但我无法保证TValue this[TKey key]并且TKey this[TValue key]会有所不同,这将是不幸的.
看起来这里的问题是当两种类型相同时,会出现特殊情况.
我的原意是要创造出准确映射一个键一个值,反之亦然,这样,每一个字典KeyValuePair<TKey, TValue>(X, Y),一个KeyValuePair<TValue, TKey>(Y, X)同样存在.
当TKey=时TValue …
public static Dictionary<int, string> dic = new Dictionary<int, string>() {
{1,"anystring1"},
{2,"anystring2"}};
Run Code Online (Sandbox Code Playgroud)
我需要用这个
string str= dic[1]; // it is possible
int a=dic["anystring1"]; // My dream is it
Run Code Online (Sandbox Code Playgroud) 是否可以实现一个约束为两个唯一通用参数的类?
如果不是,那是因为它没有实现,还是因为语言结构(继承)是不可能的?
我想要一些形式:
class BidirectionalMap<T1,T2> where T1 != T2
{
...
}
Run Code Online (Sandbox Code Playgroud)
我正在实现双向字典.这主要是好奇心问题,而不是需要.
从评论中复述:
丹:"如果不满足这种约束,会有什么负面影响?"
我:"然后用户可以使用map [t1]和map [t2]进行索引.如果它们是相同的类型,则没有任何区别,也没有任何意义."
Dan:编译器实际上允许[两个泛型类型参数来定义不同的方法重载],所以我很好奇; 它是否随意选择其中一种方法来调用?