我有一系列结构。我结构的结构如下:
[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();
但它从未对我的数组进行排序。
我为我原来的帖子发生的巨大变化而道歉。我希望我能用一个简单的例子来逃避。
答案 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);
}
}