gpt4 book ai didi

c# - 我必须在 C# 中哈希两次吗?

转载 作者:太空狗 更新时间:2023-10-29 22:13:20 24 4
gpt4 key购买 nike

我有如下代码:

class MyClass
{
string Name;
int NewInfo;
}

List<MyClass> newInfo = .... // initialize list with some values
Dictionary<string, int> myDict = .... // initialize dictionary with some values

foreach(var item in newInfo)
{
if(myDict.ContainsKey(item.Name)) // 'A' I hash the first time here
myDict[item.Name] += item.NewInfo // 'B' I hash the second (and third?) time here
else
myDict.Add(item.Name, item.NewInfo);
}

有什么方法可以避免在字典中进行两次查找——第一次查看是否包含条目,第二次更新值?甚至可能在“B”行上有两次哈希查找——一次获取 int 值,另一次更新它。

最佳答案

是 - 使用 Dictionary.TryGetValue。它采用 out 参数来接收值,并返回是否找到该值。这是您调整后的代码:

foreach(var item in newInfo)
{
int value;
if (myDict.TryGetValue(item.Name, out value))
{
myDict[item.Name] = value + item.NewInfo;
}
else
{
myDict[item.Name] = item.NewInfo;
}
}

但是,在这种特殊情况下,我们可以做得更好。如果未找到键 ,则 out 参数设置为 0。因为我们要将新值设置为 item.NewInfoitem.NewInfo + value 无论哪种方式,我们实际上都在做同样的事情。我们可以忽略方法的返回值,直接使用:

foreach(var item in newInfo)
{
int value;
myDict.TryGetValue(item.Name, out value);
myDict[item.Name] = value + item.NewInfo;
}

虽然这很不寻常 - 显然,通常您使用返回值。

题外话

只是因为您确实在执行 GetValueOrDefault 操作,它才起作用。事实上,这将是一对有效的扩展方法:

public static TValue GetValueOrDefault<TKey, TValue>
(this IDictionary<TKey, TValue> dictionary, TKey key)
{
TValue value;
dictionary.TryGetValue(key, out value);
return value;
}

public static TValue GetValueOrDefault<TKey, TValue>
(this IDictionary<TKey, TValue> dictionary, TKey key,
TValue customDefault)
{
TValue value;
if (dictionary.TryGetValue(key, out value))
{
return value;
}
else
{
return customDefault;
}
}

那时你可以让你的代码清晰并且简洁:

foreach(var item in newInfo)
{
myDict[item.Name] = myDict.GetValueOrDefault(item.Name) + item.NewInfo;
}

(您可以调用 GetValueOrDefault(item.Name, 0) 以获得更清晰的信息。)

回到正题......

请注意,您仍在进行两次查找 - 一次获取值,一次添加/替换它。如果不使 TValue 类型参数成为可变的东西,您就无法真正避免这种情况,您可以就地更改它。那是可能的,但不是很好。

在原始代码中,您可能会进行 三次 查找 - 一次查找 ContainsKey,然后两次(如果找到键)来替换值。更容易看出,如果我们展开 +=:

myDict[item.Name] = myDict[item.Name] + item.NewInfo;

(item.Name 只会计算一次,除此之外都是一样的。)

另一个题外话

最好对 Dictionary 进行操作,该操作基于一个函数进行“查找和替换”,以根据旧值获取新值,例如

bool Update(TKey key, Func<TValue, bool, TValue> replacementFunction)

其中 replacementFunction 将是一个函数,该函数采用当前值(如果未找到键,则采用 TValue 的默认值)和一个 bool 值来表示是否键实际找到,并返回新值。然后字典可以查找键,调用替换函数并更新适当的值。 (这个不能作为扩展方法实现。)

关于c# - 我必须在 C# 中哈希两次吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/787076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com