我正在使用以下查询
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
请注意,所有工作并不是同时发生的——它是延迟的(a
在 got 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/