【问题标题】:C# adding string elements of 4 different string arrays with each otherC#相互添加4个不同字符串数组的字符串元素
【发布时间】:2010-03-13 18:50:07
【问题描述】:

我需要关于如何从 4 个不同的字符串数组创建新字符串数组的建议:

我们有 4 个字符串数组:

string[] arr1 = new string []  {"a1","a2","a3"..., "a30"};  
string[] arr2 = new string []  {"d10","d11","d12","d13","d14","d15"};  
string[] arr3 = new string []  {"f1","f2","f3"...,"f20"};  
string[] arr4 = new string []  {"s10","s11","s12","s13","s14"};  

我们需要像这样将所有 4 个数组的所有字符串元素相互添加:

a1+d10+f1+s10  
a2+d10+f1+s10

...       
a1+d11+f1+s10  
a2+d11+f1+s10  
...  
a30+d15+f20+s14

我的意思是按顺序排列的所有组合:arr1_element、arr2_element、arr3_element、arr4_element
所以结果数组会是这样的:
字符串[] arr5 = 新字符串 [] {"a1d10f1s10","a2d10f1s10 "....};

【问题讨论】:

    标签: c# arrays string


    【解决方案1】:

    创建一个返回数组所有组合的递归方法:

    static IEnumerable<string> GetCombinations(string[][] arrays, int len, string start) {
      foreach (string s in arrays[len - 1]) {
        if (len == 1) {
          yield return s + start;
        } else {
          foreach (string r in GetCombinations(arrays, len - 1, s + start)) {
            yield return r;
          }
        }
      }
    }
    

    用法:

    string[][] arrays = { arr1, arr2, arr3, arr4 };
    foreach (string s in GetCombinations(arrays, arrays.Length, string.Empty)) {
      Console.WriteLine(s);
    }
    

    【讨论】:

    • 感谢您快速而有价值的回复。看起来它应该可以正常工作,但它只会产生最后一个字符串。我不知道我做错了什么。
    • @new_coder:代码已经过测试,它确实返回了所有组合。请注意,该方法不会将所有组合放入一个巨大的集合中,而是一次返回一个组合。您必须遍历结果并一次处理每个字符串。
    • 感谢您的来信。我是编程新手,您可以链接我在哪里可以阅读有关如何“循环遍历结果并一次处理每个字符串”的信息,或者请给我一个示例。非常感谢!
    【解决方案2】:

    曾几何时,我在一次编程比赛中使用了这个。它工作得很好。看看它是否适合你。

    :)

     private static IEnumerable<string> 
        GetCombinations(string[] arr1, string[] arr2, string[] arr3, string[] arr4)
            {
                int i, j, k, l;
                i = j = k = l = 0;
    
                for (i = 0; i < arr4.Length; i++)
                    for (j = 0; j < arr3.Length; j++)
                        for (k = 0; k < arr2.Length; k++)
                            for (l = 0; l < arr1.Length; l++)
                                yield return (arr1[l] + arr2[k] + arr3[j] + arr4[i]);
    
            }
    

    示例用法:

    public static void Main(string[] args)
    {
        string[] arr1 = new string[] { "a1", "a2", "a3", "a30" };
        string[] arr2 = new string[] { "d10", "d11", "d12", "d13" };
        string[] arr3 = new string[] { "f1", "f2", "f3", "f20" };
        string[] arr4 = new string[] { "s10", "s11", "s13", "s14" };
    
    
        var list = GetCombinations(arr1, arr2, arr3, arr4);
    
        foreach (var item in list.Take<string>(10))
        {
            Console.WriteLine(item);
        }
    }
    

    【讨论】:

    • 感谢您的回复。这是惊人的“紧凑”代码!:) 它似乎应该工作 - 但我有同样的问题它只导致最后一个字符串
    • 我想yield return 它,但我的互联网连接当天中断了。现在完成。 :)
    • 感谢您的帮助!您的代码运行正常,非常有用。
    【解决方案3】:

    LINQ 在这种情况下非常方便:

    var arr1 = new [] { "a1", "a2", "a3", "a4", "a5" };
    var arr2 = new [] { "b1", "b2", "b3", "b4", "b5" };
    var arr3 = new [] { "c1", "c2", "c3", "c4", "c5" };
    var arr4 = new [] { "d1", "d2", "d3", "d4", "d5" };
    
    var arr5 = (from a in arr1
                from b in arr2
                from c in arr3
                from d in arr4
                select a + b + c + d).ToList();
    

    这 5 行代码将返回:

    a1b1c1
    a1b1c2
    a1b1c3
    a1b1c4
    a1b1c5
    a1b2c1
    a1b2c2
    [...]   
    a2b1c1
    a2b1c2
    a2b1c3
    a2b1c4
    a2b1c5
    a2b2c1
    a2b2c2
    a2b2c3
    a2b2c4
    a2b2c5
    a2b3c1
    [...]
    a5b5c4
    a5b5c5
    

    【讨论】:

      【解决方案4】:

      类似的东西可能会起作用...

      List<string> AddEntries(List<List<string>> entries) {
         List<string> finalEntries = new List<string>();
      
         if (entries != null && entries.Length > 0) {
            if (entries.Length > 1) {
               foreach(string entry in entries) {
                  foreach(string subentry in AddEntries(entries.Skip(1)) {
                     finalEntries.Add(entry + subEntry);
                  }
               }
            } else {
               foreach(string entry in entries[0]) { finalEntries.add(entry); }
            }
         }
         return finalEntries;
      }
      

      我为代码道歉,我这里没有编译器来测试。假设您正在使用带有扩展方法的 C# 3.5。我冒昧地将您的 string[] 更改为 List。如果您不使用 3.5,则需要编写自己的函数来修剪嵌套数组。

      【讨论】:

      • 我认为您的意思是 .NET 3.5 或 C# 3.0。没有 C# 3.5 这样的东西。您的代码中也没有任何扩展方法的迹象...
      • 是的@Jon Skeet,我的意思是框架 3.5,我打字太快了。 Entries.Skip() 我认为是一个扩展,因为它不是默认 List 实现的一部分。
      • 啊,是的,我没有看到对 Skip 的调用。
      【解决方案5】:

      您需要对 IEnumerable 集合使用 C# 4.0 .Zip() 扩展方法。为此,该方法将委托作为参数。 示例:

         List<string> a = new List<string> { "code" };
         List<int> b = new List<int>() { 7 };
         var res =  a.Zip(b, (p1, p2) => p1.ToString() + p2.ToString());
      

      【讨论】:

      • 您应该阅读该方法的作用。它不会在项目之间创建组合,它只会将具有相同索引的项目配对。
      • Guffa,我为您提供了样本。
      • @portland:你完全没有抓住重点。我不是在要求一个例子,我是在指出该方法不能满足 OP 的要求。
      猜你喜欢
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      相关资源
      最近更新 更多