[英]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.