反转一个对象数组

4

我有一个包含对象数组的静态类。

public static Waypoint[] AtoB
        {
            get
            {
                return new Waypoint[] {
                    new Waypoint(49.251f,-851.837f),
                    new Waypoint(66.7397f,-843.165f),
                    new Waypoint(77.8777f,-825.462f)
                };
            }
        }

现在我想要创建另一个Waypoint数组,名为BtoA,它与AtoB相同,但顺序相反。因此,大致如下:
public static Waypoint[] BtoA
    {
        get { return AtoB.Reverse(); }
    }

这个可以吗?
2个回答

7
你可以使用 ToArray() 扩展方法将反转的序列保存到新数组中:
return AtoB.Reverse().ToArray();

在这种情况下,您将在内存中拥有两个数组 - 您将拥有由AtoB属性返回的数组,然后您将为该数组创建反向迭代器,并最终将反转的序列保存到全新的数组中。
或者您可以使用Array.Reverse(array)来反转原始数组:
var array = AtoB;
Array.Reverse(array);
return array;

在这种情况下,您将拥有一个单一的数组,该数组是在 AtoB 属性中创建的 - 您只需反转该数组实例的项目。
注意:您的代码不起作用,因为 Reverse() 扩展创建了一个 ReverseIterator,它不是一个数组 - 它是类型为 IEnumerable<Waypoint> 的对象。因此,您还有一个选择是将 BtoA 属性的类型更改为 IEnumerable<Waypoint>

谢谢,非常完美。另外,您能解释一下 Obj[].Reverse().ToArray()Array.Reverse(Obj[]) 之间的区别吗? - user2914191
@user2914191,在第一种情况下,您将在内存中拥有两个数组 - 一个是在您的属性中创建的,然后您将为该数组创建反向枚举器,最后将反转的序列保存到全新的数组中。在第二种情况下,您只有一个在属性中创建的单个数组 - 您只需反转该数组的项即可。 - Sergey Berezovskiy
@user2914191 顺便提一下 - 如果您需要返回带有常量数据的数组,您可以创建一个包含该数组数据的静态变量 public static readonly Waypoint[] AtoB = new [] { new Waypoint(49.251f,-851.837f), new Waypoint(66.7397f,-843.165f), new Waypoint(77.8777f,-825.462f) }; 这样您就可以重复使用同一个数组,而不是每次都创建新的数组,但在这种情况下,应该选择选项#1来反转它。 - Sergey Berezovskiy

0

好的,使用Enumerable.Reverse函数:

public static Waypoint[] BtoA
{
    get { AtoB.Reverse().ToArray();; 
}

不要忘记添加using语句:
using System.Linq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接