簡體   English   中英

在C#中對多個元素上的結構進行排序的數組

[英]Sorting array of structs on multiple elements in c#

我有一系列的結構。 我的結構的結構是這樣的:

    [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();

但它從未對我的數組進行排序。

對於原發布內容的巨大變化,我深表歉意。 我希望我可以舉一個簡單的例子。

最有效的方法仍然是使用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排序。

您必須重新分配它:

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

嘗試這個:

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

在數組上調用OrderBy將返回類型為IEnumerable<MyStructure>的新集合。 不會修改原始數組。 一旦有了新的集合,就可以在其上調用ToArray ,並將其重新分配給原始變量。

您的LINQ解決方案看起來不錯,您確定使用正確嗎? Array.Sort ,它返回新的IEnumerable而不是就地排序(就像Array.Sort ),因此您必須使用

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

如果這樣做不能解決問題,則必須顯示更多代碼。

是的,實現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);
    }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM