2012-07-31 43 views
1

我有Enumerable<KeyValuePair<TKey, TValue>>。我想製作一個bool TryGetValue(TKey, out TValue)擴展方法,就像它是在Dictionary<TKey, TValue>可用。創建擴展方法TryGetValue可枚舉的(TKEY的,出TValue)<KeyValuePair <TKEY的,TValue >>就像字典的<TKEY的,TValue>中

我試圖

public static bool TryGetValue<TKey, TValue> 
(this Enumerable<KeyValuePair<TKey, TValue>> mapping, TKey key, out TValue value) 
{ 
    bool retVal = false; 

    KeyValuePair<TKey, TValue> kvp; 

    kvp = mapping.First(x => x.Key.Equals(key)); 

    if(kvp.Key == null && kvp.Value == null) 
    { 
     retVal = false; 
     value = default(TValue); 
    } 
    else 
    { 
     retVal = true; 
     value = kvp.Value; 
    } 

    return retval; 
} 

這是正確的方式?如果不是,請建議一個。

注:

我不能使用字典,因爲鍵重複。而且它只會返回第一個匹配值?

What happens to the rest?

我們可以離開他們。我發送從DataTable創建的KeyValuePair。我正在查詢中使用order by columnname創建該數據表。

+0

我可以問你爲什麼不能使用字典中呢? – 2012-07-31 11:07:21

+0

@ YngveB.Nilsen:因爲鍵重複。你可以有一個密鑰重複字典? – 2012-07-31 11:37:32

+0

這就是我的想法..但不會在答案中的示例不完整呢?由於它只會返回第一個匹配值?剩下的事發生了什麼? – 2012-07-31 11:38:57

回答

5

爲什麼不直接使用一個簡單的循環foreach


例子:

public static bool TryGetValue<TKey, TValue> 
(this KeyValuePair<TKey, TValue>[] mapping, TKey key, out TValue value) 
{ 
    foreach(var kvp in mapping) 
     if (kvp.Key.Equals(key)) 
     { 
      value = kvp.Value; 
      return true; 
     } 

    value = default(TValue); 
    return false; 
} 

你實現將拋出一個異常,如果該鍵不因.First()存在,FirstOrDefault()將是醜陋的,因爲KeyValuePair是一個結構,因此你不能把它與null比較。


旁註:

不是擴展KeyValuePair<TKey, TValue>[]的,你可能想使用IEnumerable<KeyValuePair<TKey, TValue>>反而變得更加靈活。

+0

不必要的循環。想象一下有1000個映射的列表。這不會有點慢嗎? – 2012-07-31 11:06:07

+0

@ YngveB.Nilsen如何解決這個問題,而不使用循環? – Andre 2012-07-31 11:09:31

+0

@Andre見我的回答 – 2012-07-31 11:10:23

相關問題