我有一个具有以下结构的数据表:
Foo1 Foo2 Value
A 2 5
B 4 20
C 6 30
B 6 4
Run Code Online (Sandbox Code Playgroud)
我还有一个列表,如下所示:
Foobar
Foo1
A
B
Other
Foo2
4
6
Other
Run Code Online (Sandbox Code Playgroud)
(注意.在foobar中将有未知数量的列/条目)
我需要遍历我的列表,并为每个元素找到数据表中与子元素值匹配的平均值.例如,在Foo1中,数据表中A的平均值为5,B - 17.5,其他 - 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)
Run Code Online (Sandbox Code Playgroud)
实际上,数据表有大约50列和一些大量的行.我对SQL/LINQ缺乏经验,所以我不确定如何以一种不太慢的方式解决这个问题.特别是对于"其他"桶.我当前的策略是只做一个嵌套的foreach,然后是LINQ查询来选择与当前子元素匹配的值,并进行平均.像这样的东西:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
虽然这很慢.那是因为这是在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;
}
}
Run Code Online (Sandbox Code Playgroud)
它非常慢,因为每次到达最里面的行时都会进行查询,所以不是在1个查询中获得所需的一切,而是在数据库中来回进行N次查询(N为foobar.Count*foo. buckets.Count)
这不是你的整个代码(将东西存储到局部变量中并且不做任何事情)请发布你的整个方法,我很乐意为你提供更快的替代方案.
| 归档时间: |
|
| 查看次数: |
332 次 |
| 最近记录: |