2016-09-28 33 views
2

我一直試圖做這從幾天,但我可以做的是排序完整列表,但無法從特定索引進行排序。排序列表<byte[]>從特定列表索引直到列表的末尾在c#

可以說我有例如

List<byte[]> byteArrayList = new list<byte[]>(); 
byteArrayList.Add(new byte[]{1, 2, 3, 5, 9, 6, 7, 6, 45, 50, 39 }); 
byteArrayList.Add(new byte[]{0, 1, 0, 1, 0, 1, 0, 1, 99, 99, 99, 99, 99, 99}); 
byteArrayList.Add(new byte[]{2, 2, 2, 2, 3, 3, 3, 3 }); 
byteArrayList.Add(new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 31, 21 }); 
byteArrayList.Add(new byte[]{1, 22, 32, 22, 3, 3, 3, 3, 12, 13, 14, 15 }); 
byteArrayList.Add(new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 95, 85, 75}); 

下面的列表中,並讓說,當前的列表索引

ListPoisition = 2; 

因此清單應當由ListPoisition == 2進行排序,直到的結束名單。

結果列表看起來應該像:

byteArrayList = { {1, 2, 3, 5, 9, 6, 7, 6, 45, 50, 39 }, 
        {0, 1, 0, 1, 0, 1, 0, 1, 99, 99, 99, 99, 99, 99 }, 
        {0, 0, 0, 0, 0, 0, 0, 0, 31, 21 }, 
        {0, 0, 0, 0, 0, 0, 0, 0, 95, 85, 75}, 
        {1, 22, 32, 22, 3, 3, 3, 3, 12, 13, 14, 15 }, 
        {2, 2, 2, 2, 3, 3, 3, 3 } 
       }; 

這只是一個example.But實際列表可以包含的byte []的N多。這裏

var start = 2; 
foreach (var entry in byteArrayList) 
{ 
    entry.PartialSort(start, entry.Length - 1); 
} 

工作demo

+0

你可以利用LINQ:'List.Take(2).Concat(名單。跳過(2).OrderBy(...))'。你需要傳遞一個自定義的'Comparer'到'OrderBy'來按照你想要的方式比較兩個列表。 –

+0

如果你有什麼東西可以工作,即使它不完美,發佈它也不會有什麼傷害。 –

+0

你用什麼代碼進行排序?沒有這些信息,這不是一個好問題。 – Phil1970

回答

0

這是自定義比較:

public class CompareByteArrays : IComparer<byte[]> 
{ 
    public int Compare(byte[] a1, byte[] a2) 
    { 
     int shorterLength = a1.Length < a2.Length ? a1.Length : a2.Length; 
     for(int i = 0; i < shorterLength; i++) 
     { 
      if(a1[i] < a2[i]) 
      { 
       return -1; 
      } 
      else if(a1[i] > a2[i]) 
      { 
       return 1; 
      } 
     } 
     return a1.Length.CompareTo(a2.Length); 
    } 
} 

然後這是該函數將其從某些指標進行排序:

public List<byte[]> SortFromIndex(List<byte[]> source, int index) 
{ 
    return source.Take(index).Concat(source.Skip(index).OrderBy(o=>o, new CompareByteArrays())).ToList(); 
} 

因此,這是你如何在主撥打:

List<byte[]> byteArrayList = new List<byte[]>(); 
byteArrayList.Add(new byte[] { 1, 2, 3, 5, 9, 6, 7, 6, 45, 50, 39 }); 
byteArrayList.Add(new byte[] { 0, 1, 0, 1, 0, 1, 0, 1, 99, 99, 99, 99, 99, 99 }); 
byteArrayList.Add(new byte[] { 2, 2, 2, 2, 3, 3, 3, 3 }); 
byteArrayList.Add(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 31, 21 }); 
byteArrayList.Add(new byte[] { 1, 22, 32, 22, 3, 3, 3, 3, 12, 13, 14, 15 }); 
byteArrayList.Add(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 95, 85, 75 }); 

List<byte[]> result = SortFromIndex(byteArrayList, 2); 
+0

完美代碼。正如我所需要的那樣工作。 –

1

您可以使用下面的擴展方法

public static void PartialSort<T>(this T[] array, int startIndex, int endIndex) 
{ 
    T[] sortedList = new T[(endIndex - startIndex) + 1]; 

    for (int i = startIndex; i <= endIndex; i++) 
    { 
     sortedList[i - startIndex] = array[i]; 
    } 
    List<T> newList = new List<T>(sortedList); 
    newList.Sort(); 
    sortedList = newList.ToArray(); 

    for (int i = 0; i < sortedList.Length; i++) 
     array[i + startIndex] = sortedList[i]; 
} 

如果你想從位置2列表中的每個數組進行排序,那麼你可以做以下

如果要從列表中的索引2對每個數組進行排序,則可以執行以下操作:

var ListPosition=2; 
for (var index = 0; index < byteArrayList.Count; index++) 
{ 
    if (index >= ListPosition) 
     byteArrayList[index].PartialSort(0, byteArrayList[index].Length - 1); 
} 

這裏工作demo

修訂

根據您的意見,您要在列表進行排序,而不是在陣列內,所以在這裏你可以做什麼:

  1. 定義自定義比較器
  2. 使用列表的排序方法

的比較器類

public class ByteArrayComparer : IComparer<byte[]> 
{ 
    public int Compare(byte[] first, byte[] second) 
    { 
     // find the minimum length of the both arrays 
     var length = first.Length > second.Length ? second.Length : first.Length; 
     for (var index = 0; index < length; index++) 
     { 
      if (first[index] > second[index]) 
        return 1; 
      if (second[index] > first[index]) 
        return -1; 
     } 
     return 0; 
    } 
} 

你的代碼看起來應該是這樣

var ListPosition = 2; 
if(ListPosition< byteArrayList.Count && ListPosition>-1) 
    byteArrayList.Sort(start,byteArrayList.Count - start, new ByteArrayComparer()); 

這裏工作demo

+0

您正在排序列表中每個數組的每個元素。我正在嘗試對列表進行排序。 (從位置2開始)即:從byteArrayList [2]到byteArrayList [endOfList]。 (不對每個字節[]的元素進行排序)。請檢查我的結果byteArrayList。 –

+0

澄清,如果排序的索引大於列表中的數組的結果,結果如何?它會被認爲是最重要的? – Monah

+0

如果index = 2上的3個數組具有相同的值,那麼讓我們說3,哪個數組將首先出現?有什麼標準嗎?例如檢查下一個索引? – Monah

0

試試這個,

arrayList.Select(x => x.Take(2).Concat(x.Skip(2).OrderBy(y => y)).ToArray()).ToList(); 

如果我們檢查一下;

  • Select第一個字節的數組並取前兩個索引。(因爲我們將 CONCAT到排序列表)
  • 然後在Concat,我們skip第2指標,並責令,
  • 這些之後,前兩個指數和分類休息綁定到對方。

Skip和剩餘的元素Take的回報,這就是爲什麼使用Concat。)

這裏是result

希望幫助,

+0

我不想從位置2排序字節[]的每個元素。但我所嘗試的是從ListPosition == 2排序列表。ie:from byteArrayList [2]直到byteArrayList [endOfList](沒有排序字節[]的每個元素) –