linq count(替换foreach和/或一般加速)

时间:2016-11-21 03:51:56

标签: c# linq

question I asked previously相关(并得到了很好的答案)

我有一个列表roi和一个数组[] [] avg。该列表包含索引(当然),每个索引包含数据结构中的X,Y,Z值

我已经得到了一个可怕的foreach所需要的东西(非常慢!)而且我想知道是否有明显的方法可以加快这个速度

for (int i = 0; i < raster_max; i++)
        {
            foreach (var sublist in RasterSet)
            {
                foreach (var dataPt in sublist)
                {
                    if (RasterSet.IndexOf(sublist) == i)
                    {
                        if (dataPt.Y >= Convert.ToSingle(textBox7.Text) && dataPt.Y <= Convert.ToSingle(textBox6.Text))
                        {

                                test[0][i] = dataPt.A - avgbias[6][i];
                                if (dataPt.A - avgbias[6][i] <= tA)
                                {
                                    corrA[i]++;
                                }

                        }
                    }
                }
            }
        }

RasterSet是DataStructures列表的索引列表,其中dataPt是我需要访问的最终数据结构。 raster_max是RasterSet的长度。 avgbias [] []是我使用链接的问题帮助生成的数据集。

3 个答案:

答案 0 :(得分:1)

我能看到的最佳优化:

single s7 = Convert.ToSingle(textBox7.Text);
single s6 = Convert.ToSingle(textBox6.Text);
for (int i = 0; i < raster_max; i++)
{
    foreach (var sublist in RasterSet)
    {
        if (RasterSet.IndexOf(sublist) == i)
        {
            foreach (var dataPt in sublist)
            {
                if (dataPt.Y >= s7 && dataPt.Y <= s6)
                {
                    test[0][i] = dataPt.A - avgbias[6][i];
                    if (dataPt.A - avgbias[6][i] <= tA)
                    {
                        corrA[i]++;
                    }
                }
            }
        }
    }
}

答案 1 :(得分:1)

 foreach (var sublist in RasterSet)
     {
        foreach (var dataPt in sublist)
        {
           if (RasterSet.IndexOf(sublist) == i)
           {
           ...

这看起来很奇怪 这不是

   single s7 = Convert.ToSingle(textBox7.Text);
   single s6 = Convert.ToSingle(textBox6.Text);
   for (int i = 0; i < raster_max; i++)
   {
       var sublist = RasterSet[i]

        foreach (var dataPt in sublist)
        {
            if (dataPt.Y >= s7 && dataPt.Y <= s6)
            {
                test[0][i] = dataPt.A - avgbias[6][i];
                if (dataPt.A - avgbias[6][i] <= tA)
                {
                    corrA[i]++;
                }
            }
        }
    }

答案 2 :(得分:0)

正如我在评论中所说,你不会对此RasterSet做任何有用的事情,至少在你展示的代码中没有。唯一重要的是它包含的子列表的数量。嗯,是这样,而且由于其他答案没有提及,让我告诉你我认为最终的优化是什么:

var lowerBound = Convert.ToSingle(textBox7.Text);
var upperBound = Convert.ToSingle(textBox6.Text);

if (dataPt.Y >= lowerBound && dataPt.Y <= upperBound)
{
    raster_max = Math.Min(RasterSet.Count, raster_max);
    for (int i = 0; i < raster_max; i++)
    {
        test[0][i] = dataPt.A - avgbias[6][i];
        if (dataPt.A - avgbias[6][i] <= tA)
        {
            corrA[i]++;
        }
    }
}

请注意,dataPt.Y的范围检查也可以在开头就完成。如果dataPt.Y超出范围,则循环甚至不必启动。