gpt4 book ai didi

c# - Count() 在使用 LINQ 填充的 IEnumerable 上返回不正确的结果

转载 作者:行者123 更新时间:2023-11-30 22:26:08 26 4
gpt4 key购买 nike

首先,我对 LINQ 和 lambda 表达式有着莫名的喜爱 :)
所以我使用 LINQ 编写了一个非常简单的代码,它应该根据特定的名称模式从目录中获取文件,对它们进行排序并累积,直到累积文件的总长度超过特定阈值:

IEnumerable<FileInfo> l_allFiles = new DirectoryInfo(l_sDirName).GetFiles().Where(l_fileInfo => ms_pattern.IsMatch(l_fileInfo.Name)).OrderBy(l_fileInfo => l_fileInfo.CreationTime);
int l_nFilesTotal = l_allFiles.Count();
if (nFilesTotal > 0)
{
long l_nAccumulatedCmdLength = 0;
IEnumerable<FileInfo> l_selectedFiles = l_allFiles.TakeWhile(l_fileInfo => (l_nAccumulatedCmdLength += l_fileInfo.Length) <= Settings.Default.Threshold);

int l_nNumOfSelected = l_selectedFiles.Count();
if (l_nNumOfSelected > 0)
{
l_ret = new A { Files = l_selectedFiles };
}
}


好吧,当所有找到的文件加起来不超过阈值时,这段代码可以正常工作。
一旦不是所有找到的文件都被选择到 l_selectedFiles,在大多数情况下 l_selectedFiles.Count() 返回 0,即使 l_selectedFiles 不为空。在极少数情况下,当 l_selectedFiles.Count() 返回正确值时,对 A 类中的 Files.Count() 的连续调用会返回0
更奇怪的是,调试器总是更新 l_nAccumulatedLength 的值,而不是在执行 TakeWhile() 方法之后,而是在执行下一个 l_selectedFiles.Count( ) 语句。在没有选择所有文件的情况下,l_nAccumulatedLength 的值并不总是符合预期...
为了完成图片,我在 Windows 7 Professional 上使用 Microsoft Visual Studio 2010 Ultimate,我的项目目标是 .NET4.0

任何人都可以解释或提示这种行为和/或如何解决它吗?因为我很迷茫,甚至无法想象我到底是如何调试和解决这个问题的,而社区是我最后的希望。

提前感谢大家的回复和评论。

最佳答案

您正在修改查询中的变量:

long l_nAccumulatedCmdLength = 0;
IEnumerable<FileInfo> l_selectedFiles = l_allFiles
.TakeWhile(l_fileInfo => (l_nAccumulatedCmdLength += l_fileInfo.Length) <=
Settings.Default.Threshold);

注意 l_nAccumulatedCmdLength 的变化在你的TakeWhile条件。

这是一个非常糟糕的想法,它最终会在您每次评估时给出不同的结果。只是不要这样做。我强烈怀疑这是问题的原因。

注意这部分:

To add to the mistery, the debugger always updates the value of l_nAccumulatedLength not after execution of the TakeWhile() method, but after executing the next l_selectedFiles.Count() statement.

...很容易解释。 TakeWhile不会迭代序列 - 它只是构建一个将被延迟评估的新序列。

如果您想获得一致的结果,请使用 ToList ...但最好不要首先修改查询中的变量。使用 Aggregate创建一个序列 Tuple<FileInfo, long> long 所在的值如果需要,值是“到目前为止的大小”。

关于c# - Count() 在使用 LINQ 填充的 IEnumerable<T> 上返回不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12013670/

26 4 0