1

好的,所以我目前正在尝试查找列表中不存在于另一个字符串列表中的所有字符串。这是我的代码目前的样子:

var items = GetLiveItems(); // Returns List<string>
var currentItems = GetCurrentItems(); // Returns List<string>, Exception here

var rogueItems = items.Where(i => !currentItems.Contains(i)).ToList();

当我运行上面的代码时,我在第二行得到一个 System.NullReferenceException。如果我去掉第三行(items.Where...),异常就会消失。这两个列表相当大,第一个有 180k 字符串,第二个是 290k 字符串,但它们每个只有 12 个字符长。

可能是什么问题?

编辑:

public static List<string> GetCurrentItems()
{
    var db = DatabaseFactory.CreateDatabase("DB");
    var command = db.GetStoredProcCommand("getItems");

    var items = new List<string>();

    using (var reader = SafeSqlReader(db.ExecuteReader(command)))
    {
        while (reader.Read()) items.Add(reader.GetString("name"));
    }

    return items;
}

编辑:

所以使用下面的代码:

var rogueItems = items.Except(currentItems).ToList();

工作。谁能解释为什么我以前的方法没有?以及其他建议的方法。

编辑:

所以,由于我很难在一个可以与大家分享的项目中重现这个,我想提供这个屏幕截图来证明我没有疯。

无法解释的异常

编辑:

这是带有例外逻辑的屏幕截图,您可以看到我成功地跨过了我之前遇到异常的线路。

这里也不例外

4

2 回答 2

1

听起来像一个延迟加载问题。使用 linq,在您枚举结果之前,查询实际上不会运行。所以问题可能在于你的 SQL 生成。

于 2012-09-13T22:15:02.707 回答
1

尝试使用EXCEPTLinq 方法 - http://code.msdn.microsoft.com/LINQ-Set-Operators-374f34fe而不是WHERE !Contains

于 2012-09-13T22:29:00.030 回答