在 C# 中合并 2 个列表的内容

Combining contents of 2 lists in C#

我刚开始学习 C#。我想合并 2 个列表和 return 输出。例如:

列表 1 = 彼得、托尼、史蒂夫
名单 2 = 帕克、斯塔克、罗杰斯

最终 List/Output:
彼得·帕克
托尼·斯塔克
史蒂夫·罗杰斯

这是我的代码:

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);
                }
            }
        }
    }
}

实际输出:

Avengers Assemble
PeterParker
PeterStark
PeterRogers
TonyParker
TonyStark
TonyRogers
SteveParker
SteveStark
SteveRogers

预期输出:

Avengers Assemble
Peter Parker
Tony Stark
Steve Rogers

在你的代码中你只需要一个循环,它应该是 for,而不是 foreach

        for (var i = 0; i< firstNames.Length; i++)
        {
            string firstName = firstNames[i];
            string lastName = lastNames[i];
            Console.WriteLine(firstName + lastName);
        }

您也可以将其替换为 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));

请注意,这两种方法都假定 firstNameslastNames 具有相同数量的元素。

这可以用 LINQ 完成 Zip():

var fullNames = firstNames.Zip(lastNames, (first, last) => $"{first} {last}")

Zip 获取两个列表并同时运行它们,将函数应用于每一对。

您可以使用 for 循环并通过索引访问列表:

for(int i = 0; i < Math.Min(firstNames.Length, lastNames.Length); i++)
{
    Console.WriteLine(firstNames[i] + lastNames[i]);
} 

最好将两个相关信息存储在一个公共 class 中,例如 Avenger 具有属性 FirstNameLastName.

link 两个相关列表的另一种方法是 LINQ 的 Zip:

var zippedAvengers = firstNames.Zip(lastNames, (f,l) => f + " " + l);
foreach(string name in zippedAvengers)
    Console.WriteLine(name);

如果改变循环:

    for (int i=0; i < firstNames.Count; i++)
    {
         Console.WriteLine(firstNames[i] + " " + lastNames[i]);
    }

它会起作用。

附带说明 - 在 .NET 的较新版本中,您可以使用 $"{firstNames[i]} {lastNames[i]}"

简化连接

此外,.Zip 解决方案(由 Serg 提出):

firstNames
   .Zip(lastNames, (first, last) => first + " " + last)
   .ToList()
   .ForEach(x=>Console.WriteLine(x));

效率会更高

您正在做的是将第一个列表的每个元素与第二个列表的每个元素进行匹配。但是,如果我没猜错的话,你想做的是将第一个列表的第一个元素与第二个列表的第一个元素匹配。

为了做到这一点,我不会给你代码让你学习,但我可以告诉你去哪里:

  1. 确保您的列表大小相同,否则您将在尝试访问不存在的索引时遇到异常
  2. 使用for 循环而不是foreach,它们不那么本能但在这种情况下更有用。对于两个列表的每个索引,使第三个列表(结果)的相同索引对应于两者的连接,例如:
result[0] = firstList[0] + secondList[0];

(为了在两者之间有一个space,你必须在第一个和第二个列表项之间添加一个space)

您无缘无故地 运行 宁两个 for 循环。只需 运行 从 i = 0 到 i = 3(不包括)的一个循环。然后您可以从两个列表中选择第 i 个元素。 例子。对于 i = 0,firstNames[0] = "Peter" lastNames[0] = "Parker" 你可以打印

Console.WriteLine(firstNames[i] + " " + lastNames[i]);