在c#中对多个元素排序结构数组

时间:2013-11-20 17:51:18

标签: c# linq sorting

我有一系列结构。我结构的结构如下:

    [StructLayout(LayoutKind.Sequential)]
    public struct TOCRRESULTSHEADER
    {
        public int StructId;
        public int XPixelsPerInch;
        public int YPixelsPerInch;
        public int NumItems;
        public float MeanConfidence;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct TOCRRESULTSITEM
    {
        public short StructId;
        public short OCRCha;
        public float Confidence;
        public short X;
        public short Y;
        public short Width;
        public short Height;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct TOCRRESULTS
    {
        public TOCRRESULTSHEADER Hdr;
        public TOCRRESULTSITEM[] Item;
    }

我正在填充TOCRRESULTS类型的结构,如下所示:

  TOCRRESULTS MyArray = GetOCRForImage(filename);

我正在使用这个Y值对数组进行排序:

 Array.Sort<TOCRRESULTSITEM>(MyArray.Item, (a,b) => a.Y.CompareTo(b.Y));

有没有办法按Y和X排序而不必编写我自己的排序例程?

我尝试使用LINQ:

 var newarray = OCRLetterArray.Item.OrderBy(x => x.Y).ThenBy(x => x.X).ToArray();

但它从未对我的数组进行排序。

我为我原来的帖子发生的巨大变化而道歉。我希望我能用一个简单的例子来逃避。

5 个答案:

答案 0 :(得分:3)

最有效的仍然是使用Array.Sort,避免分配新数组:

    Array.Sort(MyArray.Item, (a, b) =>
    {
        var comparison = a.Y.CompareTo(b.Y);
        return comparison == 0 ? a.X.CompareTo(b.X) : comparison;
    });

这将按Y然后按X排序。如果您愿意,可以轻松地将其按X排序,然后按Y排序。

答案 1 :(得分:2)

你必须重新分配它:

var orderedArray = MyArray.OrderBy(a => a.Y).ThenBy(a => a.X).ToArray();

答案 2 :(得分:1)

试试这个:

MyArray = MyArray.OrderBy(a => a.Y).ToArray();

在数组上调用OrderBy会返回类型为IEnumerable<MyStructure>的新集合。它没有修改原始数组。获得新集合后,您可以在其上调用ToArray,然后将其重新分配给原始变量。

答案 3 :(得分:1)

你的LINQ解决方案看起来很好,你确定你正确使用它吗?与Array.Sort相比,返回新的IEnumerable而不是就地排序(就像Array.Sort一样),所以你必须使用

MyArray = MyArray.OrderBy(a => a.Y).ThenBy(a => a.X).ToArray();

如果这不能解决问题,则必须显示更多代码。

答案 4 :(得分:1)

是的,实施IComparable

public struct MyStructure: IComparable, IComparable<MyStructure>
 {
      public int X;
      public int Y;

    public int CompareTo(MyStructure other)
    {
        return Y.CompareTo(other.Y);
    }

    public int CompareTo(object obj)
    {
        return CompareTo((MyStructure)obj);
    }
 }