c # строка разбить и объединить - PullRequest
6 голосов
/ 10 декабря 2010

у меня есть строка, содержащая 5 чисел, таких как

'1,4,14,32,47'

я хочу сделать из этой строки 5 строк по 4 числа в каждой

нравится:

 '1,4,14,32'
 '1,4,14,47'
 '1,4,32,47'
 '1,14,32,47'
 '4,14,32,47'

каков простой / быстрый способ сделать это

- это способ конвертировать это значение в массив, не заданный каждый раз, когда разные энтеры их обратно в строку?

Есть ли простой способ сделать это?

спасибо

Ответы [ 6 ]

7 голосов
/ 10 декабря 2010

Как насчет чего-то вроде

string s = "1,4,14,32,47";
string r = String.Join(",", s.Split(',').Where((x, index) => index != 1).ToArray());
1 голос
/ 10 декабря 2010
var elements = string.Split(',');

var result =
Enumerable.Range(0,elements.Length)
.Reverse()
.Select(
 i=>
  string.Join(","
   Enumerable.Range(0,i).Concat(Enumerable.Range(i+1,elements.Length - i - 1))
   .Select(j=>elements[j]).ToArray() // This .ToArray() is not needed in NET 4
  )
).ToArray();
1 голос
/ 10 декабря 2010

Для тех, кому нужен более общий алгоритм, вот тот, который дает n подмножеств длины m элементов:

private void GetPermutations()
{
    int permutationLength = 4;
    string s = "1,4,14,32,47";
    string[] subS = s.Split(',');
    int[] indexS = new int[permutationLength];

    List<string> result = new List<string>();
    IterateNextPerm(permutationLength, indexS, subS, result);

    // Result will hold all your genberated data.
}

private void IterateNextPerm(int permutationLength, int[] pIndexes, string[] subS, List<string> result)
{
    int maxIndexValue = subS.Count() - 1;

    bool isCorrect = true;
    for (int index = 0; index < permutationLength - 1; index++)
    {
        if (pIndexes[index] >= pIndexes[index + 1])
        {
            isCorrect = false;
            break;
        }
    }

    // Print result if correct
    if (isCorrect)
    {
        string strNewPermutation = string.Empty;
        for (int index = 0; index < permutationLength; index++)
        {
            strNewPermutation += subS[pIndexes[index]] + ",";
        }
        result.Add(strNewPermutation.TrimEnd(','));
    }

    // Increase last index position
    pIndexes[permutationLength - 1]++;

    // Check and fix if it's out of bounds
    if (pIndexes[permutationLength - 1] > maxIndexValue)
    {
        int? lastIndexIncreased = null;

        // Step backwards and increase indexes
        for (int index = permutationLength - 1; index > 0; index--)
        {
            if (pIndexes[index] > maxIndexValue)
            {
                pIndexes[index - 1]++;
                lastIndexIncreased = index - 1;
            }
        }

        // Normalize indexes array, to prevent unnecessary steps
        if (lastIndexIncreased != null)
        {
            for (int index = (int)lastIndexIncreased + 1; index <= permutationLength - 1; index++)
            {
                if (pIndexes[index - 1] + 1 <= maxIndexValue)
                {
                    pIndexes[index] = pIndexes[index - 1] + 1;
                }
                else
                {
                    pIndexes[index] = maxIndexValue;
                }
            }
        }
    }

    if (pIndexes[0] < maxIndexValue)
    {
        IterateNextPerm(permutationLength, pIndexes, subS, result);
    }
}

Я знаю, что это не самая лучшая кодировка, но я написал ее прямо сейчас за последние полчаса, так что я уверен, что есть кое-что для настройки.

Веселого кодирования!

1 голос
/ 10 декабря 2010

Посмотрите на:

http://msdn.microsoft.com/en-us/magazine/ee310028.aspx Здесь вы найдете пример на F #, который даст правильный фон в комбинациях и перестановках (так называется то, что вам нужно). Есть код, я думаю, его легко перевести на C #

Пример кода на C # (текст на итальянском, но код на английском)

1 голос
/ 10 декабря 2010

Используя string.Split(), вы можете создать массив строк. Проходите через него, чтобы в каждой итерации цикла вы указывали, какой элемент следует пропустить (на первом проходе игнорируйте первый элемент, на втором проходе игнорируйте второй элемент).

Внутри этого цикла создайте новый массив, содержащий все элементы, кроме того, который вы хотите пропустить, затем используйте string.Join() для создания каждого результата.

0 голосов
/ 10 декабря 2010

ваша формулировка довольно запутанная ... но пример достаточно ясен.просто разделите на запятые, затем удалите один индекс, затем используйте string.Join (",", list);собрать его вместе ..

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