c#字符串拆分和组合

时间:2010-12-10 08:26:20

标签: c# arrays string combinations

我有一个字符串,表示像

这样的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 个答案:

答案 0 :(得分:7)

这样的东西
string s = "1,4,14,32,47";
string r = String.Join(",", s.Split(',').Where((x, index) => index != 1).ToArray());

答案 1 :(得分:1)

使用string.Split()可以创建字符串数组。循环遍历它,以便在每次循环迭代中指示应跳过哪个元素(在第一次传递时,忽略第一个元素,在第二次传递时忽略第二个元素)。

在该循环中,创建一个包含所有元素但又要跳过的元素的新数组,然后使用string.Join()创建每个结果。

答案 2 :(得分:1)

看看:

http://msdn.microsoft.com/en-us/magazine/ee310028.aspx在这里,您将找到F#中的一个示例,它将在组合和排列中给出正确的背景(这就是您需要的方式)。还有代码,我认为在C#中翻译它很容易。

Example of Code in C# (text in Italian but code in English)

答案 3 :(得分:1)

对于那些需要更通用的算法的人来说,这里给出了m个项目的n个长度子集:

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);
    }
}

我知道这不是最好的编码,但我现在已经在过去的半小时内编写了它,所以我确信那里有一些东西可以调整。

玩得开心!

答案 4 :(得分:1)

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();

答案 5 :(得分:-1)

你的措辞很混乱......但是这个例子很清楚。只需split逗号,然后remove一个索引,然后使用string.Join(“,”,list);将它重新组合在一起..