我有Enumerable<KeyValuePair<TKey, TValue>>
。我想创建一个bool TryGetValue(TKey, out TValue)
扩展方法,就像它在Dictionary<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
创建了DataTable。
答案 0 :(得分: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>>
,而不是更灵活。