2011-08-30 13 views
5

Tengo esta matriz muy simple que quiero poder mover alrededor de algunos elementos. ¿Hay alguna herramienta incorporada en C# para hacer esto? Si no, du tienes alguna sugerencia sobre cómo hacerlo.Moviendo elementos en la matriz C#

En el ejemplo

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

Y digamos que yo quiero (programación) del índice de desviación 2 y 0, creando

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

Gracias.

+0

Para que quede claro: por "shift", ¿te refieres a "swap"? –

+0

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

+0

No, lo siento, mi primer ejemplo es un poco borroso, he dejado el ejemplo un poco más claro ahora. –

Respuesta

12

EDITAR: Bien, ahora que ha cambiado el ejemplo, no hay nada incorporado, y realmente sería un poco doloroso escribir ... tendría que considerar los casos donde lo está moviendo "arriba" y hacia dónde lo está moviendo "hacia abajo", por ejemplo. Lo que quiere pruebas de unidad, pero piensa esto debería hacerlo ...

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

Probablemente debería considerar el uso de un List<T> lugar de una matriz, que le permite insertar y extraer en índices particulares. Esas dos operaciones serán más costosas que solo copiar la sección relevante, pero será mucho más legible.

+0

En realidad, esa es mi mala, no quise decir intercambio, ¡quiero poder moverme alrededor de los elementos estableciendo un nuevo índice! (actualizado mi ejemplo). ¡Gracias! –

+0

@Trikks: Bien, edité mi código. ¡Pruébalo a fondo! –

5

Es una pregunta existente:

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

La respuesta es:

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

Lo miré pero no pude implementarlo. –

+2

No creo que esto funcione cuando 'source

0

Esto resolvió mi 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); 
} 

devuelve 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

¡Bienvenido a Stack Overflow! Si bien este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y/o cómo responde este código a la pregunta mejora su valor a largo plazo. – ryanyuyu

Cuestiones relacionadas