[英]LINQ Sub-select from Dictionary based on value type
我试图从Dictionary<String, String>
选择一个Dictionary<String, Double>
Dictionary<String, String>
。 为此,我使用IEnumrable<>.Where
子选择一个Dictionary<String, String>
(有效),然后将其IEnumrable<>.Where
为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/12qjrmE,http : //bit.ly/YmuRHZ和http://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.