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
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);
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) {}
1 por la sugerencia anulable. Gran punto: eso podría ser suficiente, dependiendo del propósito del bool. –
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. Mejor solución que mi respuesta del diccionario, no debería haber supuesto que los enteros eran ID. – Brandon
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. –
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 :)
- 1. Pasando número variable de argumentos de una función a otra
- 2. Pasando el número variable de argumentos alrededor de
- 3. Pasando variable número de argumentos con diverso tipo - C++
- 4. variable pasante número de argumentos
- 5. Número de variable de argumentos en VB
- 6. Función con número variable de argumentos
- 7. C++ con número variable de argumentos
- 8. Pasando argumentos adicionales usando scipy.optimize.curve_fit?
- 9. Javascript: pasando múltiples argumentos como una sola variable
- 10. Pasando argumentos a un manejador de eventos
- 11. Módulo de extensión Python con número variable de argumentos
- 12. Formato de cadena con número variable de argumentos en java
- 13. Número de variable de Java o argumentos para un método
- 14. Cómo hacer una macro variadic (número variable de argumentos)
- 15. Cómo "transmitir" un número variable de argumentos a NSString's + stringWithFormat:
- 16. Cómo pasar un número variable de argumentos a ant exec
- 17. Pasando la lista de argumentos variables a sprintf()
- 18. Pasando variable entre winforms
- 19. Pasando argumentos a los trazadores de Hadoop
- 20. Pasando argumentos de JVM a SBT
- 21. ¿Número incorrecto de argumentos?
- 22. Mockito usando argumentos coincidentes para cuando llame al método con número variable de argumentos
- 23. Pasando número entero por referencia
- 24. Pasando una matriz de cadenas a webmethod con una cantidad variable de argumentos usando jQuery AJAX
- 25. Pasando argumentos del constructor al usar StructureMap
- 26. Pasando argumentos al cargar biblioteca CodeIgniter personalizada
- 27. call_user_func_array pasando argumentos a un constructor
- 28. bash: pasando los argumentos del script
- 29. pasando argumentos a _beginthread() - ¿Qué pasa?
- 30. Pasando argumentos a C# genérico nuevo() del tipo de plantilla
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. –
Solo por curiosidad, ¿por qué una estructura sería inapropiada para más de unas pocas variables? –
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