除了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()时性能会受到影响。让我们知道如何优化添加行到字典,任何外部自定义库,可以使用?
我会尝试将其更改为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;
}
}