2011-08-30 24 views
5

Mam bardzo prostą tablicę, którą chcę móc przenosić w niektórych elementach. Czy są jakieś wbudowane narzędzia w języku C#, aby to zrobić? Jeśli nie, to masz jakąś sugestię, jak to zrobić.Przenoszenie elementów w tablicy C#

W przykładzie

var smallArray = new string[4]; 
smallArray[0] = "a"; 
smallArray[1] = "b"; 
smallArray[2] = "c"; 
smallArray[3] = "d"; 

I powiedzmy, że chcę (programowo) indeks Shift 2 i 0, tworząc

smallArray[0] = "c"; 
smallArray[1] = "a"; 
smallArray[2] = "b"; 
smallArray[3] = "d"; 

Dzięki.

+0

Po prostu, aby było jasne: przez "przesunięcie", masz na myśli "zamiana"? –

+0

duplikat http://stackoverflow.com/questions/552731/c-good-best-implementation-of-swap-method – hatchet

+0

Nie, przepraszam, mój pierwszy przykład bas trochę niewyraźny, Podałem przykład nieco bardziej zrozumiały teraz. –

Odpowiedz

12

EDYCJA: Okay, teraz zmieniłeś przykład, nie ma nic wbudowanego - i byłoby trochę bólu pisać ... musisz wziąć pod uwagę przypadki, w których to robisz "do góry" i gdzie przenosisz to "na dół", na przykład. że chcesz testów jednostkowych, ale myślę to powinno wystarczyć ...

public void ShiftElement<T>(this T[] array, int oldIndex, int newIndex) 
{ 
    // TODO: Argument validation 
    if (oldIndex == newIndex) 
    { 
     return; // No-op 
    } 
    T tmp = array[oldIndex]; 
    if (newIndex < oldIndex) 
    { 
     // Need to move part of the array "up" to make room 
     Array.Copy(array, newIndex, array, newIndex + 1, oldIndex - newIndex); 
    } 
    else 
    { 
     // Need to move part of the array "down" to fill the gap 
     Array.Copy(array, oldIndex + 1, array, oldIndex, newIndex - oldIndex); 
    } 
    array[newIndex] = tmp; 
} 

Powinieneś raczej rozważyć użycie List<T> zamiast tablicy, która umożliwia wkładanie i wyjmowanie w poszczególnych indeksów. Te dwie operacje będą droższe niż tylko kopiowanie odpowiedniej sekcji, ale będzie o wiele bardziej czytelna.

+0

Właściwie to mój zły, nie miałem zamiaru zamieniać, chcę być w stanie poruszać się po elementach, ustawiając nowy indeks! (zaktualizowałem mój przykład). Dzięki! –

+0

@Trikks: Dobra, zredagowałem mój kod. Przetestuj to dokładnie! –

5

To istniejąca pytanie:

C# Array Move Item (Not ArrayList/Generic List)

Odpowiedź brzmi:

void MoveWithinArray(Array array, int source, int dest) 
{ 
    Object temp = array.GetValue(source); 
    Array.Copy(array, dest, array, dest + 1, source - dest); 
    array.SetValue(temp, dest); 
} 
+0

Spojrzałem na to, ale go nie wdrożyłem. –

+2

Nie sądzę, że to zadziała, gdy 'source

0

to rozwiązać mój problem

var arr = new ArrayList 
    { 
     "a", "b", "c", "d", "e", "f" 
    }; 
var first = arr[2]; //pass the value which you want move from 
var next = arr[5]; //pass the location where you want to place 
var m = 0; 
var k = arr.IndexOf(first, 0, arr.Count); 
m = arr.IndexOf(next, 0, arr.Count); 
if (k > m) 
{ 
    arr.Insert(m, first); 
    arr.RemoveAt(k + 1); 
} 
else 
{ 
    arr.Insert(k, next); 
    arr.RemoveAt(m + 1); 
} 

zwraca, b, f, c, d , e

0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace SecondLargest 
{ 
    class ArraySorting 
    { 
     public static void Main() 
     { 
     int[] arr={5,0,2,1,0,44,0,9,1,0,23}; 

     int[] arr2 = new int[arr.Length]; 
     int arr2Index = 0; 
     foreach (int item in arr) 
     { 
      if(item==0) 
      { 
       arr2[arr2Index] = item; 
       arr2Index++; 
      } 
     } 
     foreach (int item in arr) 
     { 
      if(item!=0) 
      { 
       arr2[arr2Index] = item; 
       arr2Index++; 
      } 
     } 

     foreach (int item in arr2) 
     { 
      Console.Write(item+" "); 
     } 

      Console.Read(); 

     } 
    } 
} 
+0

Witamy w Stack Overflow! Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, dlaczego i/lub jak ten kod odpowiada na pytanie, poprawia jego długoterminową wartość. – ryanyuyu

Powiązane problemy