首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建扩展方法TryGetValue(TKey,out TValue)的Enumerable<KeyValuePair<TKey,TValue>>,就像Dictionary<TKey,TValue>

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

Stack Overflow用户
提问于 2012-07-31 10:48:19
回答 1查看 2.1K关注 0票数 1

我有一个Enumerable<KeyValuePair<TKey, TValue>>。我想创建一个bool TryGetValue(TKey, out TValue)扩展方法,就像它在Dictionary<TKey, TValue>中可用一样。

我试过了

代码语言:javascript
复制
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?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-31 10:58:09

为什么不使用一个简单的foreach循环呢?

示例:

代码语言:javascript
复制
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进行比较。

Sidenote:

与扩展KeyValuePair<TKey, TValue>[]不同,您可能希望使用IEnumerable<KeyValuePair<TKey, TValue>>来提高灵活性。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11738387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档