2012-03-27 15 views
8

Para asignar un valor específico a la matriz 1D estoy usando LINQ, así:2D Array. Establecer todos los valores a valor específico

 int[] nums = new int[20]; 
     nums = (from i in nums select 1).ToArray<int>(); 
     nums[0] = 2; 

No hay manera similar a hacerlo en 2D ([x, y]) matriz? ¿O de manera corta, sin usar bucles anidados?

+5

su no establece valores en una matriz, su creación de una nueva * * array – vidstige

Respuesta

6

LINQ no funciona particularmente bien con arreglos multidimensionales.

matrices irregulares no son demasiado malo:

var array = Enumerable.Range(0, 10) 
         .Select(x => Enumerable.Repeat('x', 10).ToArray()) 
         .ToArray(); 

... pero matrices rectangulares no tienen ninguna ayuda específica. Solo usa bucles.

(. Observe el uso de Enumerable.Repeat como un enfoque algo más sencillo de crear la matriz de dimensión 1, por cierto)

+0

No es lo que necesito, Es arsenal dentro de matriz. –

1

Una forma en que podría hacerlo es así:

// Define a little function that just returns an IEnumerable with the given value 
static IEnumerable<int> Fill(int value) 
{ 
    while (true) yield return value; 
} 

// Start with a 1 dimensional array and then for each element create a new array 10 long with the value of 2 in 
var ar = new int[20].Select(a => Fill(2).Take(10).ToArray()).ToArray(); 
+0

Gracias, pero es una matriz dentro de la matriz. Estoy buscando la forma de hacerlo en una matriz 2D [x, y] –

5

Si realmente quieren evitar bucles anidados se pueden utilizar sólo un bucle:

int[,] nums = new int[x,y]; 
for (int i=0;i<x*y;i++) nums[i%x,i/x]=n; 

usted puede hacer que sea más fácil lanzando en alguna función en una clase de utilidad:

public static T[,] GetNew2DArray<T>(int x, int y, T initialValue) 
{ 
    T[,] nums = new T[x, y]; 
    for (int i = 0; i < x * y; i++) nums[i % x, i/x] = initialValue; 
    return nums; 
} 

Y utilizar de esta manera:

int[,] nums = GetNew2DArray(5, 20, 1); 
+0

Buena idea, pero me parece demasiado difícil. Estoy buscando cosas simples como LINQ. –

+2

Las dos primeras (¡DOS!) Líneas de código en esta respuesta resuelven su problema. No es compacto y puede parecer feo, pero no se puede simplificar, reducir y acelerar. – heltonbiker

+0

¿Sería un bucle for-single tan rápido en comparación con un for-loop anidado? – juFo

3

Bueno, esto podría hacer trampa, ya que simplemente se mueve el código de bucle para un método de extensión, pero sí permite inicializar la matriz 2D a una sola valor simplemente, y de una manera similar a cómo puede inicializar una matriz 1D a un solo valor.

En primer lugar, como se ha mencionado Jon Skeet, se podía limpiar su ejemplo de inicializar una matriz 1D así:

int [] numbers = Enumerable.Repeat(1,20).ToArray(); 

Con mi método de extensión, usted será capaz de inicializar una matriz 2D como esto:

public static T[,] To2DArray<T>(this IEnumerable<T> items, int rows, int columns) 
{ 
    var matrix = new T[rows, columns]; 
    int row = 0; 
    int column = 0; 

    foreach (T item in items) 
    { 
     matrix[row, column] = item; 
     ++column; 
     if (column == columns) 
     { 
      ++row; 
      column = 0; 
     } 
    } 

    return matrix; 
} 
+0

No hay ninguna razón para que este método de extensión no sea genérico, lo actualicé en consecuencia. –

1

Puedo sugerir un nuevo método de extensión.

public static class TwoDArrayExtensions 
{ 
    public static void ClearTo(this int[,] a, int val) 
    { 
     for (int i=a.GetLowerBound(0); i <= a.GetUpperBound(0); i++) 
     { 
      for (int j=a.GetLowerBound(1); j <= a.GetUpperBound(1); j++) 
      { 
       a[i,j] = val; 
      } 
     } 
    } 
} 

utilizar de esta manera:

var nums = new int[10, 10]; 
nums.ClearTo(1); 
Cuestiones relacionadas