首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Dictionary<TKey,string>实例中提取Dictionary<TKey,double>

从Dictionary<TKey,string>实例中提取Dictionary<TKey,double>
EN

Stack Overflow用户
提问于 2012-01-26 23:32:54
回答 2查看 434关注 0票数 0

我有一个通用字典,其中TValue的类型是String (Dictionary<int, string>)。我选择使用字符串作为值类型,因为数据是从一个Xml文件加载的,该文件的源值可以是字符或数字数据类型(我认为Object也是一种可以接受的TValue类型,但即使这样,这个问题也同样适用)。

字符数据类型也很重要,所以不能完全排除它们。

我想提取这个Dictionary<int, double>的一个子集。换句话说,我想要字典的子集,其中的值是数值。

现在我是这样做的:

代码语言:javascript
运行
复制
Dictionary<int, string> myDictionary;
// Do some loading.
var numericData = myDictionary.Where(kvp => Double.TryParse(kvp.Value, out temp)       

这种方法太难看了,作为一个Dictionary<int, double>,我没有得到结果。有谁能提供其他方法来改善这一点吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-26 23:38:26

您给出的代码不仅难看,而且在执行时会出现InvalidCastException错误。我怀疑你真的想:

代码语言:javascript
运行
复制
var numericData = myDictionary
        .Select(kvp => {
                    double value;
                    return new { kvp.Key,
                        Value = double.TryParse(kvp.Value, out value) 
                                   ? value : (double?) null
                    };
               })
        .Where(pair => pair.Value != null)
        .ToDictionary(pair => pair.Key, pair => pair.Value.Value);

是的,这是丑陋的--但是:

  • 它避免了多次解析该值
  • 它避免了将副作用放入查询

如果你乐于解析两次,你可以让它稍微更干净一些,但效率会更低:

代码语言:javascript
运行
复制
var numericData = myDictionary
       .Where(kvp => { double tmp; return double.TryParse(kvp.Value, out tmp); })
       .ToDictionary(pair => pair.Key, pair => double.Parse(pair.Value));

或者(更简洁地),您可以创建一个单独的方法:

代码语言:javascript
运行
复制
public static double? TryParseNullableDouble(string text)
{
    double value;
    return double.TryParse(text, out value) ? value : (double?) null;
}

然后第一个版本变成:

代码语言:javascript
运行
复制
var numericData = myDictionary
        .Select(kvp => new { kvp.Key, TryParseNullableDouble(kvp.Value) })
        .Where(pair => pair.Value != null)
        .ToDictionary(pair => pair.Key, pair => pair.Value.Value);
票数 6
EN

Stack Overflow用户

发布于 2012-01-26 23:35:09

您可以使用包含双精度值的temp变量创建一个新的字典-这利用了这样一个事实,即枚举和添加字典是逐项完成的,因此temp包含正确的双精度值:

代码语言:javascript
运行
复制
double temp = 0;
var numDict = myDictionary.Where(kvp => Double.TryParse(kvp.Value, out temp))
                          .ToDictionary( x=> x.Key, x=> temp);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9020563

复制
相关文章

相似问题

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