繁体   English   中英

LINQ根据值类型从字典中进行子选择

[英]LINQ Sub-select from Dictionary based on value type

我试图从Dictionary<String, String>选择一个Dictionary<String, Double> Dictionary<String, String> 为此,我使用IEnumrable<>.Where子选择一个Dictionary<String, String> (有效),然后将其IEnumrable<>.WhereDictionary<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/12qjrmE,http : //bit.ly/YmuRHZhttp://bit.ly/XLQNaB ,除了我希望子查询返回一个Dictionary之外键入。

您不能 Dictionary<string, string>转换为Dictionary<string, double>因为它不是一个。 您可能需要创建一个新的Dictionary (或者Dictionary<string,double>如果不需要Konstantin建议的Dictionary<string,string> ,则直接转到Dictionary<string,double> )。

实际上,您的代码甚至没有真正做到您所想的。 您链接到Where()Cast<Dictionary<string,Double>>()试图将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<>()Cast<>()序列中的每个项目 ,而不会整体转换序列。 此外,您不能将序列整体转换,因为Dictionary<string,string> 不是 Dictionary<string,double>

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

如果不需要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)));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM