Acabo de empezar a aprender C#. Quiero combinar 2 listas y devolver la salida. Por ejemplo:
Lista 1 = Pedro, Tony, Steve
Lista 2 = Parker, Stark, Rogers
Lista final/Salida:
Peter Parker
tony stark
steve rogers
Aquí están mis códigos:
using System; using System.Collections.Generic; using System.Linq; namespace HelloWorld { class Program { static void Main(string[] args) { var projectTeam = "Group Avengers"; Console.WriteLine("Avengers Assemble"); string[] firstNames = {"Peter", "Tony", "Steve"}; string[] lastNames = {"Parker", "Stark", "Rogers"}; IList<string> combinedNames = new List<string>(); foreach (string firstName in firstNames) { foreach (string lastName in lastNames) { Console.WriteLine(firstName + lastName); } } } } }Salida real:
Avengers Assemble PeterParker PeterStark PeterRogers TonyParker TonyStark TonyRogers SteveParker SteveStark SteveRogersRendimiento esperado:
Avengers Assemble Peter Parker Tony Stark Steve RogersEn su código, solo necesita un ciclo y debe ser for , no foreach
for (var i = 0; i< firstNames.Length; i++) { string firstName = firstNames[i]; string lastName = lastNames[i]; Console.WriteLine(firstName + lastName); } También puede reemplazar esto con IEnumerable.Zip ( https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.zip?view=net-6.0 )
firstNames .Zip(lastNames, (first, last) => first + last) .ToList() .ForEach(x=>Console.WriteLine(x)); Tenga en cuenta que ambos enfoques asumen que tanto firstNames como lastNames tienen la misma cantidad de elementos.
Esto se puede hacer con LINQ Zip() :
var fullNames = firstNames.Zip(lastNames, (first, last) => $"{first} {last}")Zip toma las dos listas y las revisa simultáneamente, aplicando la función a cada par.
Puede usar un bucle for y acceder a las listas a través del índice:
for(int i = 0; i < Math.Min(firstNames.Length, lastNames.Length); i++) { Console.WriteLine(firstNames[i] + lastNames[i]); } mejor sería almacenar las dos informaciones relacionadas en una clase común, por ejemplo Avenger con propiedades FirstName y LastName .
Otra forma de vincular dos listas relacionadas es Zip de LINQ:
var zippedAvengers = firstNames.Zip(lastNames, (f,l) => f + " " + l); foreach(string name in zippedAvengers) Console.WriteLine(name);Si alteras el bucle:
for (int i=0; i < firstNames.Count; i++) { Console.WriteLine(firstNames[i] + " " + lastNames[i]); }Funcionará.
Como nota al margen: en las versiones más nuevas de .NET, puede simplificar la concatenación con $"{firstNames[i]} {lastNames[i]}"
Además, la solución .Zip (propuesta por Serg):
firstNames .Zip(lastNames, (first, last) => first + " " + last) .ToList() .ForEach(x=>Console.WriteLine(x));seria mas eficiente
Lo que estás haciendo es emparejar cada elemento de la primera lista con cada elemento de la segunda lista. Pero lo que quieres hacer, si te entiendo bien, es hacer coincidir el primer elemento de la primera lista con el primer elemento de la segunda lista.
Para hacer eso, no te daré el código para que puedas aprender, pero puedo mostrarte a dónde ir:
for loop en lugar de foreach , son menos intuitivos pero más útiles en esta situación. Para cada índice de las dos listas, haga que el mismo índice de la tercera lista (el resultado) corresponda a la concatenación de los dos, por ejemplo: result[0] = firstList[0] + secondList[0];(Para tener un espacio entre los dos, debe agregar un espacio entre el primer y el segundo elemento de la lista)
Está ejecutando dos bucles for sin ningún motivo. Simplemente ejecute un solo ciclo de i = 0 a i = 3 (no incluido). Luego puede elegir el i-ésimo elemento de ambas listas. Ejemplo. for i = 0, firstNames[0] = "Peter" lastNames[0] = "Parker" Puede imprimir
Console.WriteLine(firstNames[i] + " " + lastNames[i]);