c# - 替代越来越慢的 Dictionary.Add(Key,Value)?

标签 c# dictionary

我所说的“越来越多”是指当键数较少时 Add 在开始时速度很快。插入 20% 的键后,速度变得非常慢。 50% 之后,速度变得难以忍受。

我知道键的数量越少,向字典添加新元素时“键冲突搜索”的速度就越快。但是有什么方法可以在保留 Dictionary 的同时跳过这个缺点吗?我事先知道键不会冲突,所以不需要检查,但我不知道是否有任何方法可以在代码中成功使用此信息。

顺便说一句,由于体系结构限制,我被迫使用字典结构(此结构稍后被数据库导出器吞没)。


我的代码做了什么:

var keyList = GetKeyList();
var resultDict = new Dictionary<T,T>();
foreach (var key in keyList)
{
    resultDict.Add(key,someResult);
}

编辑:因为人们在问散列码是如何生成的,我会尽力澄清这一点。

理论上我无法控制哈希代码的生成,因为不幸的是它使用了通过同一个数据库连接的多个系统之间的约定。

实际上,生成哈希码的那段代码确实是我的代码(免责声明:这不是我选择生成中使用的约定)。

key 生成比这复杂得多,但这一切都归结为:

private List<ResultKey> GetKeyList(string prefix, List<float> xCoordList, List<float> yCoordList)
{
    var keyList = new List<ResultKey>();
    var constantSensorName = "xxx";
    foreach (float xCoord in xCoordList)
    {
        foreach (float yCoord in yCoordList)
        {
            string stationName = string.Format("{0}_E{1}N{2}", prefix, xCoord, yCoord);
            keyList.Add(new ResultKey(constantSensorName, stationName));
        }
    }
    return keyList;
}

public struct ResultKey
{
    public string SensorName { get; set; }
    public string StationName { get; set; }

    public ResultKey(string sensorName, string stationName)
    {
        this.SensorName = sensorName;
        this.StationName = stationName;
    }
}

最佳答案

首先想到的是创建自己的哈希函数。字典的 Add 方法将在将字典添加到结构时调用 getHashCode() 方法的默认实现。如果您将一个包装器类放在您的键周围并覆盖 getHashCode() 方法,那么您可以编写您自己的散列函数,这大概可以实现一个不太容易发生冲突的散列函数。

关于c# - 替代越来越慢的 Dictionary.Add(Key,Value)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31811233/

相关文章:

c# - 控制图像名称

javascript - 通过javascript传递日期对象

c++ - 减去2张 map

python - list vs UserList 和 dict vs UserDict

python - 使用 python 字典时无法解压不可迭代的 int 对象

ios - Swift 运行时错误 : Dictionary literal contains duplicate keys

java - 将数组元素转换为新字典中的键的最佳方法

c# - 在 Dapper 中映射 List<KeyValuePair> 时指定字段名称

c# - 字体大小改变 KerningAdjustment,为什么?

c# - 在 Umbraco XSLT 中使用自定义类文件