在使用linq将datatable转换为dictionary时过滤掉null值

本文关键字:dictionary 过滤 null 转换 linq datatable | 更新日期: 2023-09-27 17:57:36

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

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行。如何从代码中筛选出那些空行?

在使用linq将datatable转换为dictionary时过滤掉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