C # добавление строковых элементов 4 различных строковых массивов друг с другом - PullRequest
1 голос
/ 13 марта 2010

Мне нужен совет о том, как создать новый строковый массив из 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" ....};

Ответы [ 5 ]

1 голос
/ 12 января 2013

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
1 голос
/ 13 марта 2010

Когда-то в конкурсе по программированию я использовал это. Работало нормально. Посмотрите, работает ли это для вас.

:)

 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);
    }
}
1 голос
/ 13 марта 2010

Создать рекурсивный метод, который возвращает все комбинации массивов:

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);
}
0 голосов
/ 13 марта 2010

вам нужно использовать метод расширения C # 4.0 .Zip () для коллекций IEnumerable <>. Для этой цели в качестве параметра используется deleteagate. Образец:

   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());
0 голосов
/ 13 марта 2010

Что-то похожее на это может работать ...

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 с методами расширения.Я позволил себе сменить строку [] на List.Если вы не используете 3.5, вам нужно написать собственную функцию для обрезки вложенных массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...