Quantcast
Channel: Planeta Código
Viewing all articles
Browse latest Browse all 2733

Variable not found: Tuplas como variables de control en bucles "for" de C#

$
0
0
C#

Cuando en un bucle for necesitamos más de una variable de control, lo habitual es inicializarlas fuera del bucle y luego usarlas en su interior, por ejemplo, como en el siguiente código:

int j = 0;
for (int i = 0; i < 10 && j < 100; i++)
{
    Console.WriteLine($"i = {i}, j = {j}");
    j+= 10;
}

Sin embargo, C# permite declarar varias variables en la cláusula de inicialización del bucle for, separándolas por comas, de la misma forma que podemos introducir distintas operaciones de incremento. Por lo tanto, el código anterior se puede simplificar de la siguiente manera:

for (int i = 0, j = 0; i < 10 && j < 100; i++, j += 10)
{
    Console.WriteLine($"i = {i}, j = {j}");
}

De esta forma, además de lograr un código algo más conciso, es también más expresivo: dejamos claro que el único objetivo de j es ejercer como variable de control del bucle y no será posible acceder a ella desde fuera del mismo.

Sin embargo, esto sólo es válido para variables del mismo tipo. Si intentamos usar esta sintaxis con variables de distinto tipo, obtendremos errores de compilación:

// Intentamos inicializar directamente la variable decimal...
// CS0266: Cannot implicitly convert type 'decimal' to 'int'
for (int i = 0, j = 0.0m; i < 10 && j < 100; i++, j += 10)
{
    Console.WriteLine($"i = {i}, j = {j}");
}

// Bueno, indiquémosle explícitamente el tipo, a ver qué tal...
// CS1525: Invalid expression term 'decimal'
for (int i = 0, decimal j = 0.0m; i < 10 && j < 100; i++, j += 10)
{
    Console.WriteLine($"i = {i}, j = {j}");
}

// Quizás si usamos var, el compilador use el tipo correcto...
// CS0819: Implicitly-typed variables cannot have multiple declarators
for (var i = 0, j = 0.0m; i < 10 && j < 100; i++, j += 10)
{
    Console.WriteLine($"i = {i}, j = {j}");
}

Pues por más que lo hayamos intentado, no hay forma de declarar variables de distinto tipo en la cláusula de inicialización del bucle for.

La opción en este caso es utilizar tuplas, que es una opción moderna, concisa y flexible. Una primera aproximación podría ser la siguiente, donde declaramos una variable de control de tipo tupla y usamos sus elementos en el bucle:

for (var ctrl = (i: 0, j: 0.0m); ctrl.i < 10 && ctrl.j < 100; ctrl.i++, ctrl.j += 10)
{
    Console.WriteLine($"i = {ctrl.i}, j = {ctrl.j}");
}

Aunque funciona, se ve demasiado farragoso. Afortunadamente, C# permite usar deconstruccion para simplificar el código; basta con declarar la tupla en la cláusula de inicialización del bucle y usar las variables directamente en el resto de cláusulas o cuerpo del bucle:

for ((int i, decimal j) = (0, 0.0m); i < 10 && j < 100; i++, j += 10)
{
    Console.WriteLine($"i = {i}, j = {j}");
}

O también, de forma algo más concisa, podemos dejar que el compilador infiera los tipos de las variables:

for (var (i, j) = (0, 0.0m); i < 10 && j < 100; i++, j += 10)
{
    Console.WriteLine($"i = {i}, j = {j}");
}

Publicado en Variable not found.


Viewing all articles
Browse latest Browse all 2733

Trending Articles


Vimeo 10.7.1 by Vimeo.com, Inc.


UPDATE SC IDOL: TWO BECOME ONE


KASAMBAHAY BILL IN THE HOUSE


Girasoles para colorear


Presence Quotes – Positive Quotes


EASY COME, EASY GO


Love with Heart Breaking Quotes


Re:Mutton Pies (lleechef)


Ka longiing longsem kaba skhem bad kaba khlain ka pynlong kein ia ka...


Vimeo 10.7.0 by Vimeo.com, Inc.


FORECLOSURE OF REAL ESTATE MORTGAGE


FORTUITOUS EVENT


Pokemon para colorear


Sapos para colorear


Smile Quotes


Letting Go Quotes


Love Song lyrics that marks your Heart


RE: Mutton Pies (frankie241)


Hato lada ym dei namar ka jingpyrshah jong U JJM Nichols Roy (Bah Joy) ngin...


Long Distance Relationship Tagalog Love Quotes