我正在尝试从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/12qjrmE,http://bit.ly/YmuRHZ和 http://bit.ly/XLQNaB,除了我希望子查询返回一个 字典类型也是如此。
答案 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)));