c#字节数组排序它's旋转

本文关键字:旋转 字节 数组排序 | 更新日期: 2023-09-27 17:50:33

我有一个字节数组,例如byte[] = new byte[3] { 97, 98, 99, 99, 96 }在实际情况下字节数组要长得多。

我如何获得这个数组的所有旋转并对其排序?我还需要在排序列表中保持原始索引

旋转应该像:

{ 97, 98, 99, 99, 96 },
{ 98, 99, 99, 96, 97 },
{ 99, 99, 96, 97, 98 },
{ 99, 96, 97, 98, 99 },
{ 96, 97, 98, 99, 99 }

然后我需要排序得到:

{ 96, 97, 98, 99, 99 },
{ 97, 98, 99, 99, 96 },  // <- index in rotated list/array
{ 98, 99, 99, 96, 97 },
{ 99, 96, 97, 98, 99 },
{ 99, 99, 96, 97, 98 }

我使用不有效的方式将byte[]转换为字符串,然后创建字符串数组,每个数组元素保持它的旋转,之后排序字符串数组。我还使用了内置函数"sort",所以我无法捕获我的索引。也许用LINQ或类似的东西可以做到这一点?

c#字节数组排序它's旋转

您可以扩展数组并在那里进行排序。您需要创建自己的排序机制:

public static int[] SortAndReturnIndexes(this byte[])
{
    var indexArray = new int[];
    // Your sort logic goes here
    return indexArray;
}

根据您在完成这些操作后想要对它做什么,物理地生成结果可能不是最好的方法。以下面的类为例:

public class Rotation[T] {
  private int init;
  private T[] src;
  public Rotation(T[] src, init){
    this.init = init;
    this.src = src;
  }
  public T this[int i] { //indexer
    get {
      int realindex = (i + init) % src.Length; //rotate the index
      return src[realindex];
    }
  }
}

你可以用

byte[] src = new byte[5] { 97, 98, 99, 99, 96 }
//rotate by 2
Rotation[byte] rotation = new Rotation(src, 2);
rotation[0] == 99

要对它进行排序,最好创建一个自定义IComparer,您可以将其提供给排序方法:https://msdn.microsoft.com/en-us/library/8ehhxeaf%28v=vs.110%29.aspx