linq 如何在现有列表旁边添加一个循环后数据不同的列表?

omhiaaxx  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(185)

基本上我有两个不同List

List<string> result = new List<string>;
  List<string> outputs= new List<string>;

在循环中填充输出列表,循环结束后,将在result列表中添加outputs列表。
因此在循环结束后输出将具有不同的值。
例如,在第一循环结束之后,output列表具有如下数据:

exampleData1
exampleData2
exampleData3

等等
因此result列表现在将具有这三个示例数据。
现在,循环将再次命中,并加载不同的数据,如:

exampleData1.1
exampleData2.1
exampleData3.1

现在它应该将这三个示例数据添加到result列表中:
因此现在结果列表应该如下所示:

exampleData1, exampleData1.1
exampleData2, exampleData2.1
exampleData3, exampleData3.1

所以它应该在每个loop之后继续,在output列表改变之后,它应该像一个字符串一样并排添加。
我试过这样的事情:

foreach (var (item1, item2) in output.Zip(output, (xo, y) => (xo, y)))
    result.Add($" {item1}, {item2}");

但这只是将现有的列表并排添加,这样我就有了相同值的两倍。
我希望我已经解释清楚了,如果没有,请让我知道。

zrfyljdw

zrfyljdw1#

Zip是个好主意,但是要小心。
如果序列的元素数不同,则该方法合并序列,直到到达其中一个序列的末尾。
因为result为空,所以在开始之前就已经到达了结尾。解决方案是使用Zip没有迭代的元素来完成:

result = result.Zip(outputs, (r, o) => r + ", " + o)
    .Union(result.Skip(outputs.Count)) // Add element from result not iterated by Zip
    .Union(outputs.Skip(result.Count)) // Add element from outputs not iterated by Zip
    .ToList();
c6ubokkw

c6ubokkw2#

看看这个:https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.zip?view=net-7.0我认为您的代码中有一个错误。您将outputsoutputs(即其本身)“压缩”,您需要将其与result压缩。

var mergedLists = result.Zip(outputs, (first, second) => first + " " + second);

已更新以下是完整的控制台应用解决方案:

List<string> result = new();
for (var i = 0; i < 3; i++)
{
    List<string> outputs = new();
    for (var j = 0; j < 3; j++)
    {
        outputs.Add($"TestData{i}.{j}");
    }

    if (!result.Any())
    {
        result = outputs.ToList();
    }
    else
    {
        result = result.Zip(outputs, (first, second) => first + " " + second).ToList();
    }
}

Console.WriteLine(string.Join(Environment.NewLine, result));
Console.ReadLine();

相关问题