我有一个具有以下结构的数据表:
Foo1 Foo2 Value
A 2 5
B 4 20
C 6 30
B 6 4
我也有一个列表列表,看起来像这样:
Foobar
Foo1
A
B
Other
Foo2
4
6
Other
(注意。foobar中的列/条目的数量将是未知的)
我需要遍历列表,并为每个元素在数据表中找到与子元素值匹配的平均值。例如,在Foo1中,数据表中A的平均值为5,B-17.5,Other-30。
Foobar
Foo1
A (average is 5)
B (average is 17.5)
Other (average is 30)
Foo2
4 (average is 20)
6 (average is 17)
Other (average is 5)
实际上,数据表具有约50列和一些大量的行。我对SQL / LINQ经验不足,所以我不确定如何以不算慢的方式解决此问题。特别是对于“其他”存储桶。我当前的策略是先执行嵌套的foreach,然后执行LINQ查询以选择与当前子元素匹配的Values,然后取平均值。像这样:
foreach (var foo in foobar)
{
foreach (var bucket in foo.buckets)
{
var hits = myDataTable.Where(n => n[foo.name].ToString() == bucket.name);
if (hits.Any())
{
bucket.average = hits.Select(x => x["Value"]).Average();
}
}
}
虽然很慢。是因为这是在LINQ中,还是因为我这样做的方式很差?
编辑
我进行了一些更改,这些更改提高了速度,但是仍然很慢。
foreach (var foo in foobar)
{
var pairs = myDataTable.Select(
n => new {Name = n[foo.name], Value = n["Value"]});
foreach (var bucket in foo)
{
var temp = pairs.Where(n => bucket.name == n.Name);
bucket.average = temp.Any() ? temp.Select(x => x.Value).Average() : 0;
}
}
最佳答案
这非常慢,因为每次到达最内层行时都会进行查询,因此,不是在1个查询中获得所需的所有内容,而是在数据库中来回查询N次(N为foobar.Count * foo。桶数)
这不能是您的整个代码(将某些内容存储到局部变量中而不执行任何操作),请发布整个方法,我们很乐意为您提供更快的替代方法。
关于c# - 这是因为它在LINQ中还是因为我做的不好而运行缓慢吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24086300/