Ho bisogno di scrivere una funzione che richiederà un numero variabile di argomenti. Leggo un po 'di params [], ma non penso che funzionerà nel mio caso. La mia funzione deve prendere un numero variabile di ints e quindi un valore bool corrispondente per ognuno di essi. Devo scorrere tutte queste combinazioni e inserirle in un database. Sto solo cercando qualcuno che mi indichi la giusta direzione. Grazie.Passaggio di numero variabile di argomenti
risposta
Suggerirei di costruire una struttura e quindi passare quelli in come parametri. Nel mio esempio, lo struct rappresenta un punteggio di qualche tipo:
public struct RaceScore
{
public bool FinishedRace;
public int Points;
}
La tua firma metodo sarebbe allora:
public void SaveScores(params RaceScore[] scores)
Ecco un esempio di SaveScores chiamata:
RaceScore score = new RaceScore() { FinishedRace = true, Points = 20 };
RaceScore score2 = new RaceScore() { FinishedRace = false, Points = 15 };
SaveScores(score, score2);
Esatto, non funzionerà come descritto. Quello che potresti fare è usare una struct per unire il valore int e bool. Parametri di struct stanno lavorando:
public struct IntBoolStruct {
public bool BoolValue;
public int IntValue;
}
public void YourMethod(params IntBoolStruct[] values) {}
EDIT: A seconda di ciò che si vuole fare, un int nullable potrebbe aiutare, anche.
public void YourMethod(params int?[] values) {}
+1 per il suggerimento nullable. Ottimo punto: potrebbe essere sufficiente, a seconda dello scopo del bool. –
Puoi fai questo con i parametri, ma i parametri devono essere una classe o una struttura che contenga il tuo int + il tuo bool. KeyValuePair<TKey,TValue>
nelle librerie della classe base funzionerebbe, se non si desidera scrivere la propria classe o struttura.
Se hai intenzione di scorrere su di essi, tuttavia, ti consiglio di utilizzare IEnumerable<T>
invece, poiché è molto più semplice da usare.
Ad esempio:
public void SaveValues(IEnumerable<KeyValuePair<int,bool>> values)
{
foreach(var pair in values)
{
int intVal = pair.Key;
bool boolVal = pair.Value;
// Do something here...
}
}
La stessa cosa avrebbe lavorato con params, vale a dire:
public void SaveValues(params KeyValuePair<int,bool>[] values)
Questo, però, ti costringe a fare un array. L'utilizzo di IEnumerable<T>
funzionerà con un array, ma funzionerà anche con elenchi di valori, risultati di query LINQ, ecc. Ciò rende più facile chiamare questa funzione in molti casi.
+1. Soluzione migliore della risposta del mio dizionario, non avrei dovuto supporre che gli interi fossero ID. – Brandon
Sembra che sarebbe perfetto, ma non penso che sia disponibile in 1.1, che è quello che mi è limitato con questo progetto. Avrei dovuto saperlo. –
E un'altra risposta: è possibile farlo con un semplice array di oggetti e parametri.
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);
}
}
dando
[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
passando un dizionario o un elenco con una struct appropriata sarebbe meglio però :)
- 1. Numero variabile di argomenti in VB
- 2. Funzione con numero variabile di argomenti
- 3. Funzione OCaml con numero variabile di argomenti
- 4. passando il numero variabile di argomenti
- 5. passaggio numero variabile di argomenti a Scala (2.8) caso di classe al costruttore genitore
- 6. Passaggio all'elenco di argomenti variabili a sprintf()
- 7. Modulo di estensione Python con numero variabile di argomenti
- 8. subroutine di script batch: passaggio di argomenti
- 9. passaggio di argomenti utilizzando drupal_get_form()
- 10. Passaggio di argomenti a un gestore eventi
- 11. Come passare il numero variabile di argomenti alla funzione lambda
- 12. Numero variabile di argomenti in stored procedure PL/SQL
- 13. C++: puntatore alle funzioni con numero variabile di argomenti
- 14. Numero variabile di Java o argomenti per un metodo
- 15. Il C# supporta un numero variabile di argomenti e come?
- 16. Come fare una macro variadic (numero variabile di argomenti)
- 17. come inoltrare il numero variabile di argomenti in un'altra funzione?
- 18. Come "passare" un numero variabile di argomenti a NSString's + stringWithFormat:
- 19. Passando numero variabile di argomenti da una funzione all'altra
- 20. Numero errato di argomenti?
- 21. redirect mentre il passaggio di argomenti
- 22. Mockito utilizzando gli argomenti di confronto per quando chiama il metodo con numero variabile di argomenti
- 23. Clojure: passaggio di argomenti facoltativi "espansi"
- 24. Passaggio di una variabile jquery
- 25. File di dichiarazione TypeScript per la funzione con numero/tipo di argomenti variabile
- 26. Bash - Passaggio di argomenti per riferimento
- 27. passaggio di argomenti a init in ember.js
- 28. passaggio di argomenti a $ .then funzione
- 29. passaggio di argomenti a filtro JQ
- 30. argomenti di lunghezza variabile C#
Va notato che una struttura è davvero appropriata solo per un paio di variabili. Una classe è più adatta per qualcosa di più. –
Solo per curiosità, perché una struttura sarebbe inappropriata per più di alcune variabili? –
In parte a causa della semantica delle strutture pass-by-value: ogni volta che ne passi uno in un metodo, viene creata una copia, che è più costosa del passaggio di un riferimento (che è ciò che accadrebbe se passassi invece un tipo di riferimento) . – Ant