【问题标题】:How to intertwine two strings or arrays, possibly with String.Join()如何交织两个字符串或数组,可能使用 String.Join()
【发布时间】:2012-07-03 02:06:03
【问题描述】:

我有以下字符串数组:

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() 方法工作,但不能:-(。

【问题讨论】:

  • 所以你有两个数组,一个是 {'A', 'B', 'C'} 另一个是 {"t1", "t2"} ?
  • 你想将两者相乘,然后从结果数组中创建一个字符串?
  • 是的,很抱歉我错过了在那里输入第二个数组。将更新帖子。

标签: c# arrays string cartesian-product


【解决方案1】:

不知道有没有直接的方法存在,但是这个单行

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

应该这样做。

【讨论】:

    【解决方案2】:

    这行得通:

    var query = from x in new[]{"A", "B", "C"}
            from y in new[]{"t1", "t2"}
            select y + "." + x;
    
    var result = string.Join(", ", query.ToArray());
    

    【讨论】:

      【解决方案3】:

      这种序列的术语是"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));
      

      【讨论】:

      • 虽然这是一个很棒的链接和代码 sn-p,但这里似乎总是只有 2 套,所以你不需要那个更通用的版本;您可以只使用一个 SelectMany 调用。
      • @Servy,当然。我知道这是通用的-对于有用的答案,已经有很高的投票答案:)
      • 感谢您向我介绍这叫什么。我会相应地编辑帖子,以便其他人找到答案。
      【解决方案4】:

      如果两个序列的长度相同,您可能会使用Enumerable.Zip

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

      【讨论】:

      • 他需要笛卡尔积。这不是Zip 所做的。
      猜你喜欢
      • 1970-01-01
      • 2011-07-17
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 2017-06-08
      相关资源
      最近更新 更多