除了dictionary.add之外,有没有更快的方法在c#字典中添加行?

本文关键字:方法 字典 添加行 add dictionary 之外 有没有 除了 | 更新日期: 2023-09-27 18:15:29

我们使用键值对都作为字符串的dictionary, dictionary在foreach循环中添加了数百万行。分析器结果显示字典。增加百万加上命中数的运行时间分钟

方法参考如下。

public virtual Dictionary<string, string> CreateDictionaryRow(string[] row)
{
    Dictionary<string, string> dictionaryRow = new Dictionary<string, string>();
    foreach (ColumnMappingBO item in this.Layout.Items)
    {
        string value = string.Empty;
        if (!string.IsNullOrEmpty(item.ColumnPosition))
        {
            if (item.ColumnPosition == "ZZ")
            {
                value = string.Empty;
            }
            else
            {
                if (LayoutPosition.TryGetValue(item.ColumnID, out Ordinal))
                {
                    if (row.Length > Ordinal)
                    {
                        if (row[Ordinal] != null)
                        {
                            value = row[Ordinal];
                        }
                    }
                }
            }
        }
        dictionaryRow.Add(item.ColumnNameID, value);
    }
    return dictionaryRow;
}

所有代码行都很好,当执行dictionaryRow.Add()时性能会受到影响。让我们知道如何优化添加行到字典,任何外部自定义库,可以使用?

除了dictionary.add之外,有没有更快的方法在c#字典中添加行?

我会尝试将其更改为LINQ查询。

也许像这样:

    public Dictionary<string, string> CreateDictionaryRow(string[] row)
    {
        return this.Layout.Items.ToDictionary(item => item.ColumnNameID, 
                                    item => GetValue(item, row));;
    }
    private string GetValue(ColumnMappingBO item, string[] row)
    {
        string value = string.Empty;
        if (!string.IsNullOrEmpty(item.ColumnPosition))
        {
            if (item.ColumnPosition == "ZZ")
            {
                value = string.Empty;
            }
            else
            {
                if (LayoutPosition.TryGetValue(item.ColumnID, out Ordinal))
                {
                    if (row.Length > Ordinal)
                    {
                        if (row[Ordinal] != null)
                        {
                            value = row[Ordinal];
                        }
                    }
                }
            }
        }
        return value;
    }

要试验的一件事是有多少唯一的哈希码项。ColumnNameId生成。如果有很多碰撞,你基本上就像在链表上迭代一样,直到你到达最后,然后在最后添加对象。

下面是调用来自http://referencesource.microsoft.com/#q=Dictionary

的dictionary.Add()时调用的代码

有很多冲突,你开始循环和比较键很多,有这么大的字典,你可以预料到一些冲突。

void Insert(TKey key, TValue value, bool add) {        
            if (buckets == null) Initialize(0);
            int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;
            int targetBucket = hashCode % buckets.Length;
            for (int i = buckets[targetBucket]; i >= 0; i = entries[i].next) {
                if (entries[i].hashCode == hashCode && comparer.Equals(entries[i].key, key)) {
                    entries[i].value = value;
                    version++;
                    return;
                } 
}