c# - .ToArray() 的慢速 LINQ 查询

标签 c# winforms performance linq

我正在使用以下查询

foreach (var callDetailsForNode_ReArrange in callDetailsForNodes_ReArrange)
{
    var test = from r1 in dtRowForNode.AsEnumerable()
               join r2 in dtFileRowForNode.AsEnumerable()
               on r1.Field<int>("Lng_Upload_Id") equals r2.Field<int>("Lng_Upload_Id")
               where ((r1.Field<string>("Txt_Called_Number") == callDetailsForNode_ReArrange.caller2.ToString()) || r1.Field<string>("Txt_Calling_Number") == callDetailsForNode_ReArrange.caller2.ToString())
               select r2.Field<string>("Txt_File_Name");

    var d = test.Distinct();
}

到这里为止,这个查询很快就运行了。但是正如我添加的

string[] str =d.ToArray();
strFileName = string.Join(",", str);

运行大约需要 4-5 秒。是什么让它在添加 .ToArray() 时如此缓慢?

最佳答案

Upto here this query run in no time.

到目前为止,它实际上没有做任何事情,只是构建了一个延迟执行模型来表示待处理 查询。它不会开始迭代,直到您在迭代器上调用 MoveNext(),即通过 foreach,在您的例子中是通过 .ToArray()

所以:它需要时间,因为它正在工作

考虑:

static IEnumerable<int> GetData()
{
    Console.WriteLine("a");
    yield return 0;
    Console.WriteLine("b");
    yield return 1;
    Console.WriteLine("c");
    yield return 2;
    Console.WriteLine("d");
}
static void Main()
{
    Console.WriteLine("start");
    var data = GetData();
    Console.WriteLine("got data");
    foreach (var item in data)
        Console.WriteLine(item);
    Console.WriteLine("end");
}

这个输出:

start
got data
a
0
b
1
c
2
d
end

请注意,所有工作并不是同时发生的——它是延迟的(agot data 之后)和假脱机(我们没有得到 a,...,d,0,...2).


相关:这就是 Distinct() 的大致工作方式,来自评论:

public static IEnumerable<T> Distinct<T>(this IEnumerable<T> source) {
    var seen = new HashSet<T>();
    foreach(var item in source) {
        if(seen.Add(item)) yield return item;
    }
}

...

和一个新的Join操作:

public static string Join(this IEnumerable<string> source, string separator) {
    using(var iter = source.GetEnumerator()) {
        if(!iter.MoveNext()) return "";
        var sb = new StringBuilder(iter.Current);
        while(iter.MoveNext())
            sb.Append(separator).Append(iter.Current);
        return sb.ToString();
    }
}

并使用:

string s = d.Join(",");

关于c# - .ToArray() 的慢速 LINQ 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16481740/

相关文章:

c# - 在文档 SP URL 中查找单词

c# - Visual Studio - 尝试将从其他表单获取的变量添加到表中

c# - 读取和处理 XML 文件

c# - 仅输入数字和控制按钮

mysql - 为什么我的带有子查询的 sql 查询速度如此之慢,即使子查询执行得很快?

android - 在 Android 上使用 PNG 制作动画

c# - 如果结果返回 null,则为 TextBlock 提供默认值

c# - Couchbase Lite 2.0.0 C# 不区分大小写的查询

c# - 在 C# 中调整大小时保留表单纵横比

java - 额外字符串比较与 HashMap 查找的性能