创建可枚举<keyvaluepair <tkey,tvalue =“”>&gt;的扩展方法TryGetValue(TKey,out TValue)就像Dictionary <tkey,tvalue =“”> </tkey,> </keyvaluepair <tkey,>

时间:2012-07-31 10:48:20

标签: c# .net extension-methods

我有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。

1 个答案:

答案 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>>,而不是更灵活。