如何交织两个字符串或数组,可能与String.Join()

时间:2012-07-02 16:14:49

标签: c# arrays string cartesian-product

我有以下字符串数组:

var myArray1 = new string[] {"A", "B", "C"};
var myArray2 = new string[] {"t1", "t2"};

我希望能够生成一个如下所示的最终字符串:

var myFinalString = "t1.A, t2.A, t1.B, t2.B, t1.C, t2.C";

我知道我可以迭代遍历数组的每个元素并手动构建字符串。但是,我想知道是否有更好的方法。我试图找出如何使String.Join()方法工作,但不能: - (。

4 个答案:

答案 0 :(得分:6)

我不知道存在任何直接方法,但是这个单行

return 
  from a in myArray 
  from b in tTerms 
  select string.Format("{0}.{1}", b, a)

应该这样做。

答案 1 :(得分:4)

这有效:

var query = from x in new[]{"A", "B", "C"}
        from y in new[]{"t1", "t2"}
        select y + "." + x;

var result = string.Join(", ", query.ToArray());

答案 2 :(得分:2)

此类序列的术语是"Cartesian Product"

以下是Eric Lippert关于Computing a Cartesian Product with LINQ

的漫长博客

正如在其他答案中已经显示的那样,元组的序列可以通过以下代码获得,而不是聚合(在字符串的情况下使用Join,或者对于其他类型的结果使用Aggregate)来生成最终的字符串:

var product =
    from first in s1
    from second in s2
    select new[] { first, second };
var result String.Join(", ", 
   product.Select(p => String.Format("{0}.{1}", p.first, p.second));

答案 3 :(得分:-1)

如果这两个序列的长度相同,您可能会Enumerable.Zip为您工作。

var myFinalString = myArray.Zip(mySecondArray, (f, s) => f + "." + s);