如何使用分隔符组合多个字符串列表

15

我有三个字符串列表,目的是将这些列表用分隔符组合成一个单独的字符串。

List<string> list1=new List<string>{"A","B","C"};
List<string> list2=new List<string>{"=","<", ">"};
List<string> list3=new List<string>{"1","2","3"};

最终输出结果如下:

A=1 AND B<2 AND C>3

有没有简单的方法生成最终字符串?我用了for循环,但这似乎很丑陋。我知道C#中的字符串有Join方法,可以使用分隔符将数组组合起来。如何使用分隔符组合多个数组?

以下是我的代码:

StringBuilder str = new StringBuilder();
for(int i=0; i< list1.count; i++)
{
    str.AppendFormat("{0}{1}{2} AND ", list1[i], list2[i], list3[i]);
}
str.Length = str.Length -5;
string final = str.ToString();

我意识到这并没有真正回答你的问题,但如果数据是在一个多(2)维数组中,或者你的三个列表都包含在一个父列表中,那么你的问题可能更容易解决。 - Paul Michaels
1
使用for循环完全没问题。如果你真的认为它看起来太丑了,你仍然可以将其包装到一个单独的方法中,在你的代码中“隐藏”这个循环。 - Robin B
8
你现在在所有地方都使用列表吗?为什么不用一个单一的 List<Comparison>,并用属性来表示 OperatorVariableValue 呢?没有必要通过索引连接多个集合,这通常是需要重构的代码坏味道。这个类可以重写 ToString 方法来返回你所需要的内容。 - Tim Schmelter
str.Length = str.Length - 5;不起作用 str.Length是只读的。 - fubo
4个回答

24

使用 Linq 的 Zip() 两次:

string result = string.Join(" AND ", list1.Zip(list2, (l1, l2) => l1 + l2).Zip(list3, (l2, l3) => l2 + l3));

https://dotnetfiddle.net/ZYlejS


10

您可以使用string.Join和linq的组合:

string.Join(" AND ", list1.Select((e1, idx) => $"{e1} {list2[idx]} {list3[idx]}"));

7
请注意确保所有列表的大小相同。 - Tim Schmelter

3
您可以使用MoreLINQ中的一个重载版本EquiZip()
var res = string.Join(" AND ", list1.EquiZip(list2, list3, (x, y, z) => x + y + z));

1
你还可以使用string.JoinEnumerable.Range的组合,像这样:
string result = string.Join(" AND ", Enumerable.Range(0, Math.Min(list1.Count, 
                                    Math.Min(list2.Count, list3.Count)))
                      .Select(i => $"{list1[i]} {list2[i]} {list3[i]}"));

如果列表保证具有相同的大小,则可以简化为:
string b = string.Join(" AND ", Enumerable.Range(0, list1.Count)
                 .Select(i => $"{list1[i]} {list2[i]} {list3[i]}"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接