我有一个具有以下结构的数据表:

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/

10-13 04:43