1

我在我继承的代码中发现了这一点,事实上它是 Linq 而我以前没有 Linq-ed。我看过一些例子,但我想这不是 100% Linq 问题,但也许是。

我有这个构造:

var categories = dtResults.AsEnumerable().Select(r => r["Cat"]).Distinct().ToList();

将 400 个类别指示符作为字符串返回。dtResultsDataTable从查询中获取其数据的。

接下来,我循环遍历categories第一次迭代时出现Unable to cast object of type 'System.DBNull' to type 'System.String'.错误,因为category索引 0 在循环中为空:foreach(string category in categories)

我无法更改数据,但可以插入空格,但我该怎么做呢?

更新 @flup请求的循环:

foreach (string category in categories)
    {
        for (int i = 0; i < WucEntries2.Length; i++)
        {
            drOutput = dtOutput.NewRow();
            drOutput["Category"] = category;
            drOutput["SubCategory "] = subCategories[i];

            drResults = dtResults.Select(String.Format("Category = '{0}' AND SubCategory = '{1}'", category, subCategories[i]));
            if (drResults.Length > 0)
            {
                foreach (DataColumn column in dtResults.Columns)
                {
                    drOutput[column.ColumnName] = drResults[0][column.ColumnName];
                }
            }
            dtOutput.Rows.Add(drOutput);
        }
4

2 回答 2

2

你不能投到DBNullstring但你可以投到nullstring所以也许:

var categories = dtResults.AsEnumerable()
    .Select(r => r["Cat"] == DBNull.Value ? (string)null : r["Cat"].ToString())
    .Distinct()
    .ToList();

这也会使您的列表 aList<string>而不是List<object>.

于 2013-03-11T15:06:39.467 回答
1

也许你可以试试:

var categories = dtResults.AsEnumerable().Select(r => Convert.ToString(r["Cat"]))
                                         .Distinct()
                                         .ToList();

希望这会有所帮助

于 2013-03-11T15:02:29.537 回答