3

我想将具有相同索引的两个列表转换为一个列表。鉴于这种:

List<double> ListA = new List<double> {  1,  2,  3,  4,  5  };
List<string> ListB = new List<string> { "A","B","C","D","E" };

直到现在,我用这个:

List<string> UNHAPPY = new List<string>();
for (int ListIndex = 0; ListIndex < ListA.Count; ListIndex++)
{
    UNHAPPY.Add(ListB[ListIndex]+ListA[ListIndex].ToString());
}
// such that UNHAPPY == new List<string> {"A1", "B2", "C3", "D4", "E5"}

但我真的想尽可能使用短代码,就像这样(类似于 Enumerable.ConvertAll):

List<string> HAPPY = SOME_CONTAINER(ListA, ListB).SOME_SELECTOR((a,b) => b + a.ToString());

// such that HAPPY == new List<string> {"A1", "B2", "C3", "D4", "E5"}

有什么快速的方法吗?提前谢谢你!

4

3 回答 3

6

LINQ 有一个方法,它被称为Zip

var res = ListA.Zip(ListB, (a,b) => $"{b}{a}");

它需要两个序列和一个Func委托,并将委托应用于来自两个序列的项目对。

注意:ToString on的调用是多余的,C# 将通过调用相应的对象a将一个字符串连接到任何东西,包括一个。我更喜欢字符串插值,尤其是当您需要连接两个以上的项目时。intToString

于 2017-10-14T10:07:59.287 回答
2

你正在寻找Enumerable.Zip

first.Zip(second, (f, s) => f + s.ToString());
于 2017-10-14T10:07:19.430 回答
2

您可以使用以下命令执行此操作Zip

ListA.Zip(ListB, (a,b) => b + a.ToString());

这会产生:

csharp> List<double> ListA = new List<double> {  1,  2,  3,  4,  5  };
csharp> List<string> ListB = new List<string> { "A","B","C","D","E" };
csharp> ListA.Zip(ListB, (a,b) => b + a.ToString());
{ "A1", "B2", "C3", "D4", "E5" }

Zip同时迭代两个可迭代对象并生成由函数构造的乘积。从可迭代对象之一用尽的那一刻起,Zip停止。

于 2017-10-14T10:08:05.933 回答