创建Enumerable <KeyValuePair <TKey,TValue >>的扩展方法TryGetValue(TKey,out TValue),就像Dictionary <TKey,TValue>一样

Nik*_*wal 1 .net c# 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;
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?如果没有,请建议一个.

注意:

我不能使用字典,因为键是重复的.而且它只返回第一个匹配值?

What happens to the rest?

我们可以离开他们.我发送从DataTable创建的KeyValuePair.我order by columnname在其查询中使用DataTable创建.

slo*_*oth 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;
}
Run Code Online (Sandbox Code Playgroud)

如果密钥由于不存在而导致您的实现将抛出异常.First(),并且FirstOrDefault()因为KeyValuePair是结构而难以实现,因此您无法将其与之进行比较null.


边注:

相反延伸KeyValuePair<TKey, TValue>[],你可能想使用IEnumerable<KeyValuePair<TKey, TValue>>,而不是变得更加灵活.

  • @ YngveB.Nilsen告诉我更多关于`ToLookup`如何工作*没有*循环整个数组... (2认同)