Как сделать комбинацию строк в C #? - PullRequest
0 голосов
/ 08 июня 2011

Мне нужно сделать комбинацию из укусов "a", "b", "c", "d". Я попытался поместить их в список, а затем проанализировать через них метод foreach, но безрезультатно.

Что еще я могу сделать?

Ответы [ 6 ]

3 голосов
/ 08 июня 2011

Имея строки в массиве, вы можете использовать следующую функцию для печати всех перестановок, чтобы она выводила: abcd, abdc, adbc и т. Д.

Рекурсивная перестановка (из MSDN):

public static void Permute(string[] strings, int start, int finish)
  {
    if (start == finish)
    {
      for (int i = 0; i <= finish; ++i)
      {
        Console.Write(strings[i] + " " );
      }
        Console.WriteLine("");
    }
    else
    {
      for (int i = start; i <= finish; ++i)
      {
        string temp = strings[start];
        strings[start] = strings[i];
        strings[i] = temp;

        Permute(strings, start+1, finish);

        temp = strings[start];
        strings[start] = strings[i];
        strings[i] = temp;
      }
    }

  }  // Permute()
0 голосов
/ 10 июня 2011

Этот пример делает все комбинации (правильные):

using System;
using System.Linq;
using System.Collections.Generic;

public static class Program
{
    public static void Main(string[] args)
    {
        var list = new [] { "a", "b", "c", "d" };
        foreach (var combi in Enumerable.Repeat(list, list.Length).CartesianProduct())
            Console.WriteLine(string.Join(" ", combi));
    }

    static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences) 
    { 
        IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() }; 
        return sequences.Aggregate( 
                emptyProduct, 
                (accumulator, sequence) =>  
                from accseq in accumulator  
                from item in sequence  
                select accseq.Concat(new[] {item}));                
    }
}

Вывод:

a a a a
a a a b
a a a c
a a a d
a a b a
a a b b
a a b c
a a b d
a a c a
a a c b
....
d d b c
d d b d
d d c a
d d c b
d d c c
d d c d
d d d a
d d d b
d d d c
d d d d

Если вам нужны перестановки, вы можете добавить алгоритм из

  1. MoreLinq
  2. CodeProject http://www.codeproject.com/KB/recipes/Combinatorics.aspx
0 голосов
/ 08 июня 2011
List<String>stringList = new List<String>();

stringList.Add("a");
stringList.Add("b");
...
...

foreach(string item in stringList)
 {
   string text=item;
}
0 голосов
/ 08 июня 2011

если у вас есть заданное количество строк, вы можете использовать

var s = String.Format("{0}{1}{2}{3}", stringA, stringB, stringC, stringD);

в противном случае цикл for / foreach будет способом продвижения вперед,

var sb = new StringBuilder();
var strings = new List<string>();

// Add strings to list

for (var i = 0; i < strings.Count; i++)
{
    sb.Append(strings[i]);
}

var s = sb.ToString();

Я бы не использовал конкатенацию «строка + строка + стиль строки», так как это плохая практика из-за того, как строки работают в памяти.

РЕДАКТИРОВАТЬ: я не проверял код, который был написан в браузере! дайте мне знать, если у вас возникнут проблемы.

Как только вы увидели комментарии выше, код, который я разместил, всегда будет выводить строки в одном и том же порядке, поэтому может не соответствовать вашему желанию.

НТН

OneShot

0 голосов
/ 08 июня 2011

Я дам вам логику.

Создайте List<String> и затем продолжайте добавлять каждую строку к нему.

List<String> s = new List<String>();  

s.add("a");
s.add("b");
s.add("c");
s.add("d");  

После того, как вы добавили все строки, затем сгенерируйте случайное число между минимальным и максимальным индексом, например:

private int RandomNumber(int min, int max)
{
Random random = new Random();
return random.Next(min, max); 
}  

Затем, печатая каждую строку в цикле по спискус этим числом убедитесь, что проверяет, что одно и то же случайное число не повторяется для следующей итерации.

0 голосов
/ 08 июня 2011

Будет ли у вас список?

List<String>myStrings = new List<String>();

myStrings.Add("a");
...
myStrings.Add("d");

Вы должны быть в состоянии пройти через это

...