2013-04-09 41 views
7

在做这样的事情:C#字典TryGetValue为int值,如何避免重复查找

int value; 
if (dict.TryGetValue(key, out value)) 
{ 
    if (condition) 
    { 
     //value = 0; this copies by value so it doesn't change the existing value 
     dict[key] = 0; 
    } 
} 
else 
{ 
    dict[key] = 0; 
} 

有什么方法可以让我避免索引查找替换现有的价值?我已经使用TryGetValue验证了密钥是否存在,因此看起来像是一种浪费,不得不再次通过索引检索值。

在另一个注释中,与我的代码的else {}部分一样,在添加新值或替换旧值时使用索引器通常被认为是很好的做法,并且添加以清楚说明您正在添加而不是替换?或者我应该每次只使用索引器?我学会了使用字典的方式,我总是做一个TryGetValue查找,并在else部分处理没有密钥存在的情况。

+0

你不会查找它两次。 – 2013-04-09 13:52:26

+1

@ DanielA.White:使用索引器进行查找IIRC; p – leppie 2013-04-09 13:53:09

+1

您的(条件)是否依赖于“值”? – 2013-04-09 13:53:11

回答

4

有什么办法可以避免索引查找来替换现有的值吗?

不,我知道 - 但词典的访问应该是非常快,除非你具有的选择覆盖GetHashCode不佳的自定义类。

如果因为双重查找而没有看到性能问题,我会放弃它。

+0

谢谢,这不会导致性能问题,但是由于这种模式对我来说经常出现,我想我会问一次,并学习最佳的方式。 – tmakino 2013-04-09 13:59:33

0

我更喜欢为这样的事情定义方便扩展方法。例如:

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

    public static TValue GetOrSet<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value) 
    { 
     return dictionary[key] = dictionary.GetValueOrDefault(key, value); 
    } 

这里有一点需要担心的字典哈希查找&表现 - 我主要关注的可读性和可维护性。通过以上的扩展方法,这种事情是一个班轮:

int value = dict.GetOrSet(key, 0); 

(声明:不执行if (condition)支票 - 我很少经历这些场景)

0

你可以试试这个出

Object value; 
if (dict.TryGetValue(key, out value)) 
{ 
    if (condition) 
    { 
     //value.data = 0; this copies by value so it doesn't change the existing value 
     value.data = 0; 
    } 
} 
else 
{ 
    value.data = 0; 
} 

故事的本质是,你正在提取的类型是一个泛型类型,并分配在堆上。即当你取出它时,它会作为价值出现。但是,如果您取出对象,它将是对原始分配对象的引用,您可以修改对象的特定属性的值。