c# - 强制LINQ再次执行?

标签 c# linq

我从一本 C# 书中得到了这段代码:

int minSize = 10000;
var bigFiles = from file in GetAllFilesInDirectory(@"c:\")
 where new FileInfo(file).Length > minSize
 select file;

var filesOver10k = bigFiles.ToArray();

minSize = 100000;
var filesOver100k = bigFiles.ToArray();

minSize = 1000000;
var filesOver1MB = bigFiles.ToArray();

minSize = 10000000;
var filesOver10MB = bigFiles.ToArray();

作者说它会在每次调用 ToArray() 时重新评估查询。我想做类似的事情。我需要查询字母表中的每个字母在一本书中使用了多少次;目前我正在使用这样的东西:

string alphabet="abcdefghijklmnopqrstuvwxyz";

foreach(char a in alphabet)
{
 var stat_letter=book2.book.Sum(b=>b.chapter.Sum(l=>l.line.Sum(w=>w.word.ToLower().Count(c=>c.Equals(a)))));
 Console.WriteLine(a + ":" + stat_letter.ToString() );
}

我得到的输出:

a: 31278
b: 6263
c: 14561
[...]

我想将其更改为更像书中的示例:

char q = 'a';
var stat_letter = book2.book.Sum(b=>b.chapter.Sum(l=>l.line.Sum(w=>w.word.ToLower().Count(c=>c.Equals(q)))));

string alphabet="abcdefghijklmnopqrstuvwxyz";

foreach(char a in alphabet)
{
 q=a;
 Console.WriteLine(q + ":" + stat_letter.ToString() );
}

我从中得到的输出:

a: 31278
b: 31278
c: 31278
[...]

在这种情况下,查询似乎没有重新评估。有什么办法强制吗?其实我的动机是检查它是否会加快程序执行速度,所以如果你认为它不会,那也是我想知道的......

最佳答案

Sum 返回一个 int(使用您选择的重载)而不是一个 IEnumerable。这意味着它会立即求值,因为它需要 intint 的值不能延迟。

虽然有几种方法可以重新构建代码以延迟执行,但我更愿意做的是创建一个方法(或 lambda,实际上是相同的概念),根据您的输入计算您想要的值,而不是改变查询所依赖的变量。

Func<char, int> computeLetterCount = letter => book2.book.Sum(
    b=>b.chapter.Sum(
        l=>l.line.Sum(
            w=>w.word.ToLower().Count(c=>c.Equals(letter)))));

你现在可以写:

foreach(char a in alphabet)
{
     Console.WriteLine(a + ":" + computeLetterCount(a) );
}

关于c# - 强制LINQ再次执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23435474/

相关文章:

c# - 使用 Amazon.Lambda.AspNetCoreServer 的自定义授权方数据

C# 应用程序 - 从命令行运行 FFMpeg 不起作用

c# - ASP.net Linq 查询 InvalidOperationException : The class '' has no parameterless constructor

c# - 如何获取条件为字符串数组的记录

c# - 如何在 Linq 中订购日期?

c# - WTSQueryUserToken 返回 FALSE

c# - 文档光标的路径是什么?

c# - 使用 Linq 查询丢失 foreach

c# - 在 C# 服务器和 PHP 客户端中使用 RSA KeyPair

linq - 流畅的 mongo Count() 性能