无法反转整数数组

时间:2014-01-13 17:02:16

标签: c# arrays reverse

我目前正在创建一个Legend组件,它将文本映射到看起来像这样的渐变图例:

enter image description here

代码的核心部分如下所示(省略graphics声明代码片段,因为这不是主要部分):

        int numberOfItems = 10;
        int increment = (int) Math.Round((max - min), 0);
        int step = increment / numberOfItems;

step存储到大小为integer的{​​{1}}数组中的数组。

10

String Reversal Code Snippet

        int[] legend = new int[numberOfItems];
        for (int i = 0; i < legend.Length; i++) {
            legend[i] = step * i;
        }

我也尝试过:

        for (int i = (legend.Length - 1); i >= 0; i--) {
            g.DrawString(legend[i].ToString(), drawFontX, Brushes.White, ((newWidth / 2) - 5), (newHeight / 10) + (verticalDistance * i), stringFormatTimes);
        }

正如您所知,我试图让图表将文本从最大值渲染到最低值,而不是现在正在执行的操作,即0 - 1080.

我的问题是,尽管使用了两种阵列反转方法,但我无法反转 legend.Reverse(); for (int i = 0; i < numberOfItems; i++) { g.DrawString(legend[i].ToString(), drawFontX, Brushes.White, ((newWidth / 2) - 5), (newHeight / 10) + (verticalDistance * i), stringFormatTimes); } 数组。我不太确定我做错了什么。

3 个答案:

答案 0 :(得分:3)

legend.Reverse绑定到Enumerable.Reverse,它会返回一份副本。如果你不需要,这应该教你不要改变状态。而是从旧数据创建新数据。

var legendContents =
 Enumerable.Range(0, numberOfItems)
 .Select(i => step * i)
 .Reverse()
 .Select(i => new { Text = i.ToString(), Y = (newHeight / 10) + (verticalDistance * i) }
 .ToArray();

//at this point you can easily examine all draw operations in the debugger

var xPos = ((newWidth / 2) - 5);
foreach (var legendItem in legendContents)
 g.DrawString(legendItem.Text, drawFontX, Brushes.White, xPos, legendItem.Y, stringFormatTimes);    

使用函数式编程风格。保存了大量代码,现在非常易读且易于更改。

答案 1 :(得分:2)

试试这个:

legend = legend.Reverse().ToArray();

问题是您使用的Reverse方法不会更改原始对象;它以相反的顺序创建一个包含原始项目的新对象。但是你没有保存Reverse方法的结果。它被忽略了。如果您将legend变量的值重新分配给Reverse方法的结果,则应该可以解决您的问题。

另一种选择是使用List<int>

List<int> legend = new List<int>(numberOfItems);
for (int i = 0; i < numberOfItems; i++) {
    legend.Add(step * i);
}

//...

legend.Reverse();

在这里,您将调用Reverse类上的List<T>方法,该方法确实会更改调用列表的顺序,而不是返回新实例。

答案 2 :(得分:2)

你错过了你的任务:

legend = legend.Reverse().ToArray();