LINQ基于值类型从字典中进行子选择

时间:2012-12-20 00:05:44

标签: c# linq

我正在尝试从Dictionary<String, Double>中选择Dictionary<String, String>。要执行此操作,我使用IEnumrable<>.Where,因此子选择Dictionary<String, String>(有效),然后将其转换为Dictionary<String, Double>(不起作用)。

我的代码:

//linesTable is an System.data.DataTable object
//...for loop code in here
DataRow row = linesTable.Rows[i]; //Where i is the loop index
Dictionary<String, String> valuesDictionary 
    = row.Table.Columns.Cast<DataColumn>().ToDictionary(
                col => col.ColumnName, 
                col => row.Field<String>(col.ColumnName));
//ATTEMPT #1
/*Dictionary<String, Double> numericValues = valuesDictionary.Where(
                subs => 
                    { 
                        double doubleValue; 
                        return double.TryParse(subs.Value, out doubleValue);                
                    }).Cast<Dictionary<String, Double>>();*/
//ATTEMPT #2
Dictionary<String, Double> numericValues = valuesDictionary.Where(
    subs => {
        double doubleValue;
        return double.TryParse(subs.Value, out doubleValue);
    }
).ToDictionary<String, Double>(
    pair => pair.Key,
    pair => double.Parse(pair.Value));

我做错了什么?

我需要Dictionary<String, Double>格式的原因是因为我有一个接受这种类型的方法,我需要将字典数据传递给。

提前致谢!

  

类似问题:我的问题类似于:http://bit.ly/12qjrmEhttp://bit.ly/YmuRHZ和   http://bit.ly/XLQNaB,除了我希望子查询返回一个   字典类型也是如此。

2 个答案:

答案 0 :(得分:4)

您无法 Dictionary<string, string>投放到Dictionary<string, double>,因为它不是Dictionary。您需要创建一个新的Dictionary<string,double>(如果您不需要康斯坦丁建议的Dictionary<string,string>,请直接转到Cast<Dictionary<string,Double>>()。)

事实上,您的代码甚至没有真正按照您的想法行事。您链接到Where()的{​​{1}}正在尝试将IEnumerable中的每个项目投放到Dictionary<string, Double>

我认为你想要的是:

Dictionary<String, Double> numericValues = valuesDictionary
      .Where(
            pair => 
                { 
                    double doubleValue; 
                    return double.TryParse(subs.Value, out doubleValue);                
                })
      .ToDictionary(pair => pair.Key, pair => double.Parse(pair.Value);

也就是说,对于可以解析double的所有情况,请将它们放在新的Dictionary<string, double>中。

当然,您可以使用RegEx或类似的东西来使Where更漂亮,但关键点是Cast<>()是将每个项目投射到序列,它不会整个序列。此外,您无法整理序列,因为Dictionary<string,string> a Dictionary<string,double>

因此,您需要一个新的Dictionary,使用ToDictionary()是实现目标的唯一选择...

答案 1 :(得分:2)

如果您不需要Dictionary<String, String>,则可以立即制作:

Dictionary<String, Double> valuesDictionary =
    row.Table.Columns.Cast<DataColumn>()
                     .Where(col =>
                     {
                         double d;
                         return double.TryParse(row.Field<String>(col.ColumnName), out d);
                     })
                     .ToDictionary(
                         col => col.ColumnName,
                         col => double.Parse(row.Field<String>(col.ColumnName)));