访问IEnumerable会清除内容

时间:2015-03-09 11:54:53

标签: c# cassandra ienumerable

我有一个返回IEnumerable的数据库(Cassandra)查询。试图找出为什么没有返回数据(当我知道数据库中的数据时)我发现了一个奇怪的问题。

查询实际上返回数据,25个条目。我用Data.Count()检查了这个;但后来在代码中,它是空的。我意识到计数方法无法清除数据。

经过快速调查:任何读取此数据的信息都会完全清除。即使在调试中,如果我加载"结果视图"要获取数据列表,最初我看到我的25个条目 - 然后如果我单击关闭,然后重新加载结果视图:Emtpy。

以前有过这样的人吗?

        String connectionString = "SELECT * FROM thedatabase WHERE thecondition";

        RowSet Data = ExecuteComand(connectionString);

        if (Data == null) // interestingly, I can check for null without issue
        {
            OutputMessage("Output to " + exportFile + " failed");
            return;
        }
        int b = Data.Count(); // results in 25
        int c = Data.Count(); // results in 0

2 个答案:

答案 0 :(得分:4)

我不知道cassandra但是我假设返回的IEnumerable<T>是懒惰地执行(延迟)。通过使用它(例如foreachToListCount),执行查询并处理/关闭资源(即连接)。

如果是这种情况,您可以将其加载到内存集合中,例如:

var data = ExecuteComand("SELECT * FROM thedatabase WHERE thecondition").ToList();

现在您可以使用data.Count而无需“清除”它。

答案 1 :(得分:3)

无法保证Enumerable可以枚举两次。正确构建的可枚举应该至少抛出异常,但总是会发生错误的代码。你可以做的是在一个表现良好的集合中实现它,例如List<T>

var data2 = Data.ToList();

int b = data2.Count;
int c = data2.Count;

现在你甚至可以获得Count是O(1)而不是O(N)的优势:-)(在List<T>中,Count值是&#34;缓存& #34)