我目前正在创建一个Legend组件,它将文本映射到看起来像这样的渐变图例:
代码的核心部分如下所示(省略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);
}
数组。我不太确定我做错了什么。
答案 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();