2009-05-27 13 views
5

Necesito escribir una función que tomará una cantidad variable de argumentos. Leí un poco sobre params [], pero no creo que funcione en mi caso. Mi función necesita tomar un número variable de entradas y luego un valor bool correspondiente para cada una de ellas. Tengo que iterar a través de cada una de estas combinaciones e ingresarlas en una base de datos. Solo busco a alguien que me señale en la dirección correcta. Gracias.Pasando Variable Número de argumentos

Respuesta

16

Recomendaría construir una estructura y luego pasarlas como params. En mi ejemplo, su estructura representa una puntuación de algún tipo:

public struct RaceScore 
{ 
    public bool FinishedRace; 
    public int Points; 
} 

Su firma método sería entonces:

public void SaveScores(params RaceScore[] scores) 

He aquí un ejemplo de SaveScores llaman:

RaceScore score = new RaceScore() { FinishedRace = true, Points = 20 }; 
RaceScore score2 = new RaceScore() { FinishedRace = false, Points = 15 }; 
SaveScores(score, score2); 
+2

Debe tenerse en cuenta que una estructura realmente solo es apropiada para un par de variables. Una clase es más adecuada para algo más que eso. –

+0

Solo por curiosidad, ¿por qué una estructura sería inapropiada para más de unas pocas variables? –

+1

En parte debido a la semántica de paso de valor de las estructuras: cada vez que pasas uno a un método, se crea una copia, que es más costosa que pasar una referencia (que es lo que pasaría si estuvieras pasando un tipo de referencia) . – Ant

5

Correcto, no funcionará como se describe. Lo que podrías hacer es usar una estructura para unir el valor int y el valor bool. Parámetros de estructuras están trabajando:

public struct IntBoolStruct { 
    public bool BoolValue; 
    public int IntValue; 
} 

public void YourMethod(params IntBoolStruct[] values) {} 

EDIT: En función de lo que quiere hacer, un int anulable podría ayudarle, también.

public void YourMethod(params int?[] values) {} 
+0

1 por la sugerencia anulable. Gran punto: eso podría ser suficiente, dependiendo del propósito del bool. –

11

Puede haz esto con params, pero los params deben ser de alguna clase o estructura que contenga tu int + tu bool. KeyValuePair<TKey,TValue> en las bibliotecas de la clase base funcionaría, si no desea escribir su propia clase o estructura.

Sin embargo, si vas a repetirlos, te recomendaría usar IEnumerable<T>, ya que es mucho más fácil de usar.

Por ejemplo:

public void SaveValues(IEnumerable<KeyValuePair<int,bool>> values) 
{ 
    foreach(var pair in values) 
    { 
     int intVal = pair.Key; 
     bool boolVal = pair.Value; 
     // Do something here... 
    } 
} 

Lo mismo que trabajaría con params, es decir:

public void SaveValues(params KeyValuePair<int,bool>[] values) 

Esto, sin embargo, que obliga a realizar una matriz. El uso de IEnumerable<T> funcionará con una matriz, pero también funcionará con listas de valores o resultados de consultas LINQ, etc. Esto hace que la generación de esta función sea más fácil en muchos casos.

+1

+1. Mejor solución que mi respuesta del diccionario, no debería haber supuesto que los enteros eran ID. – Brandon

+1

Parece que sería perfecto, pero no creo que esté disponible en 1.1, que es lo que estoy restringido con este proyecto. Debería haber notado eso. –

0

Y otra respuesta: puede hacer esto con una simple matriz de objetos y params.

class paramstest { 
     private void _passALot(params Object[] values) { 
      System.Console.WriteLine(" [foreach]"); 

      foreach (object o in values) { 
       System.Console.Write(o.ToString() + ", "); 
      } 

      System.Console.WriteLine(System.Environment.NewLine + " [for]"); 

      for (int i = 0; i < values.Length; i += 2) { 
       int? testval = values[i] as Int32?; 
       bool? testbool = values[i + 1] as Boolean?; 

       System.Console.WriteLine(String.Format("Int: {0}, Bool: {1}", testval, testbool)); 
      } 
     } 

     public void test() { 
      _passALot(1, true, 2, false, 3, true, "q", false); 
     } 
    } 

dándole

 
[foreach] 
1, True, 2, False, 3, True, q, False, 
[for] 
Int: 1, Bool: True 
Int: 2, Bool: False 
Int: 3, Bool: True 
Int: , Bool: False 

El paso de un diccionario o una lista con una estructura apropiada sería mejor, aunque :)

Cuestiones relacionadas