我正在使用以下代码将数据表转换为字典:
Dictionary<string, decimal> dict = dt.AsEnumerable()
.Select(dr => new { Key = dr["key_col"], Value = dr["value_col"] })
.ToDictionary(kvp => (string)kvp.Key, kvp => (decimal)kvp.Value);
但它向我抛出了一个"输入字符串格式不正确"的异常。我很确定这是因为datatable
中存在一些null
行。如何从代码中筛选出那些空行?
我不确定这个异常,但如果您想删除所有null值,可以添加Where子句。
Dictionary<string, decimal> dict = dt.AsEnumerable()
.Where(dr => dr["key_col"] != null && !string.IsNullOrEmpty(dr["key_col"].ToString()))
.Select(dr => new { Key = dr["key_col"], Value = dr["value_col"] })
.ToDictionary(kvp => (string)kvp.Key, kvp => (decimal)kvp.Value);
您可能还想在Where子句中尝试!string.IsNullOrEmpty(dr["key_col"] as string)
。但是我在转换列值时遇到过一些问题。因此,我倾向于使用dr["key_col"] != null && !string.IsNullOrEmpty(dr["key_col"].ToString())
。
查询中唯一的字符串是字典的键。该异常表明您稍后正试图将其转换为数字类型(例如int.Parse
)。
您应该在查询中执行此操作,并使用Dictionary<int, decimal>
。例如:
int key;
Dictionary<int, decimal> dict = dt.AsEnumerable()
.Where(dr => int.TryParse(dr.Field<string>("key_col"), out key))
.Select(dr => new { Key = key, Value = dr.Field<decimal>("value_col") })
.ToDictionary(x=> x.Key, x=> x.Value);
如果它实际上不是int
而是不同的类型,例如double
使用double.TryParse