string
。我想使用其值从集合中检索密钥。
我的应用程序在多线程环境中运行。
那么,最快的方法是什么?
答案 0 :(得分:2)
您的问题给人的印象是您的字典在键和值之间具有一对一的映射。如果是这种情况,和如果字典不经常更改,和如果您需要多次检索某个键的值,最快的方法是来建立反向字典,其中原始字典中的值是键,而键是值。这是一些前期工作,但之后会更快:
var revDict = new Dictionary<string, int>();
foreach (var kvp in yourDict) revDict[kvp.Value] = kvp.Key;
编辑:或使用LINQ:
var revDict = yourDict.ToDictionary(kvp => kvp.Value, kvp => kvp.Key);
答案 1 :(得分:1)
如果我可以假定您具有键和值的双向一对一映射,并且要从多个线程访问和更新字典,那么我建议您创建一个线程安全的双向字典。
public class Map<T1, T2>
{
private object _gate = new object();
private Dictionary<T1, T2> _forward = new Dictionary<T1, T2>();
private Dictionary<T2, T1> _reverse = new Dictionary<T2, T1>();
public Map()
{
this.Forward = new Indexer<T1, T2>(_gate, _forward);
this.Reverse = new Indexer<T2, T1>(_gate, _reverse);
}
public class Indexer<T3, T4>
{
private object _gate;
private Dictionary<T3, T4> _dictionary;
public Indexer(object gate, Dictionary<T3, T4> dictionary)
{
_dictionary = dictionary;
_gate = gate;
}
public T4 this[T3 index]
{
get { lock (_gate) { return _dictionary[index]; } }
set { lock (_gate) { _dictionary[index] = value; } }
}
}
public void Add(T1 t1, T2 t2)
{
lock (_gate)
{
_forward.Add(t1, t2);
_reverse.Add(t2, t1);
}
}
public Indexer<T1, T2> Forward { get; private set; }
public Indexer<T2, T1> Reverse { get; private set; }
}
您将像这样使用它:
var map = new Map<int, string>();
map.Add(42, "Life");
Console.WriteLine(map.Forward[42]);
Console.WriteLine(map.Reverse["Life"]);
输出:
Life 42