我正在使用以下代码将数据表转换为字典:
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);
但是它输入的输入字符串格式不正确&#39;例外。我很确定这是因为null
中存在一些datatable
行。如何从此代码中过滤掉那些空行?
答案 0 :(得分:2)
我不确定异常,但是如果要删除所有空值,可以添加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())
。
答案 1 :(得分:2)
查询中唯一的字符串是字典的键。例外情况表明您之后尝试将其转换为数字类型(例如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