与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 [] []是我使用链接的问题帮助生成的数据集。
答案 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
超出范围,则循环甚至不必启动。