从字典中检索记录的最快方法是包含一百万条记录

时间:2019-02-13 08:56:06

标签: c# multithreading winforms collections

我有一本字典,其中包含一百万条记录;键是数字,其值是string。我想使用其值从集合中检索密钥。

我的应用程序在多线程环境中运行。

那么,最快的方法是什么?

2 个答案:

答案 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