5

我正在尝试Dictionary<String, Double>Dictionary<String, String>. 为此,我使用IEnumrable<>.Whereso 子选择 a 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/YmuRHZhttp://bit.ly/XLQNaB,除了我希望子查询返回字典类型为好。

4

2 回答 2

4

您不能aDictionary<string, string>转换为 a,Dictionary<string, double>因为它不是一个。您将需要创建一个新的Dictionary(或者Dictionary<string,double>如果您不需要Dictionary<string,string>康斯坦丁建议的)。

事实上,你的代码甚至没有真正按照你的想法去做。Cast<Dictionary<string,Double>>()您链接到 的是Where()试图将 中的每个项目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<>()要转换序列中的每个项目,而不是将序列作为一个整体进行转换。此外,您不能将序列作为一个整体进行转换,因为aDictionary<string,string>不是a 。 Dictionary<string,double>

因此,您需要一个新的Dictionary,并且使用ToDictionary()是到达那里的一种选择......

于 2012-12-20T00:12:18.987 回答
3

如果你不需要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)));
于 2012-12-20T00:12:30.897 回答