使用linq将数据表转换为字典时过滤掉空值

时间:2016-07-18 07:18:47

标签: c# linq dictionary datatable

我正在使用以下代码将数据表转换为字典:

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行。如何从此代码中过滤掉那些空行?

2 个答案:

答案 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