2011-08-30 19 views
5

Ho questo array molto semplice che voglio essere in grado di spostarmi all'interno di alcuni elementi. Esistono strumenti incorporati in C# per fare questo? In caso contrario, hai qualche suggerimento su come farlo.Spostare elementi nell'array C#

Nell'esempio

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

e permette di dire che voglio (di programmazione) Indice Shift 2 e 0, creando

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

Grazie.

+0

Giusto per essere chiari: con "shift", intendi "scambio"? –

+0

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

+0

No, scusa il mio primo esempio è un po 'confuso, ho reso l'esempio un po' più chiaro adesso. –

risposta

12

EDIT: Okay, ora avete modificato l'esempio, non c'è niente di built-in - e sarebbe effettivamente essere un po 'di fatica a scrivere ... avresti bisogno di prendere in considerazione i casi in cui si sta spostandolo "su" e dove lo stai spostando "in basso", per esempio. Che ci si vuole test di unità, ma io pensa questo dovrebbe farlo ...

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; 
} 

Probabilmente si dovrebbe considerare l'utilizzo di un List<T> al posto di un array, che consente di inserire e rimuovere in particolari indici. Queste due operazioni saranno più costose rispetto alla sola copia della sezione pertinente, ma sarà molto più leggibile.

+0

In realtà questo è il mio male, non intendevo swap, voglio essere in grado di spostarmi tra gli elementi impostando un nuovo indice! (aggiornato il mio esempio). Grazie! –

+0

@Trikks: Ok, ho modificato il mio codice. Provalo a fondo! –

5

E 'una domanda esistente:

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

La risposta è:

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

L'ho guardato ma non l'ho implementato. –

+2

Non penso che funzionerà quando 'source

0

Questo risolto il mio problema

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); 
} 

restituisce a, 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

Benvenuto in Stack Overflow! Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo sul perché e/o su come questo codice risponde alla domanda migliora il suo valore a lungo termine. – ryanyuyu

Problemi correlati