使用c#将字符串拆分成对

时间:2011-02-07 20:53:05

标签: c# string

有没有办法在不查看索引的情况下将字符串分成几对?例如 TVBMCVTVFGTVTB将被分成一个字符串列表:

[TV,BM,CV,电视,FG,电视,TB]

也许我应该说问题是,当使用字符串将它们分成组时,它是一个类似于string.join或string.split的函数。

6 个答案:

答案 0 :(得分:6)

哦,来吧,只需使用这样的索引:

public static class StringExtensions {
    public static IEnumerable<string> TakeEvery(this string s, int count) {
        int index = 0;
        while(index < s.Length) {
            if(s.Length - index >= count) {
                yield return s.Substring(index, count);
            }
            else {
                yield return s.Substring(index, s.Length - index);
            }
            index += count;
        }
    }
}

我没有添加任何保护条款。

用法:

var items = "TVBMCVTVFGTVTB".TakeEvery(2);
foreach(var item in items) {
    Console.WriteLine(item);
}

答案 1 :(得分:2)

如果你喜欢一些深奥的解决方案:

<强> 1)

string s = "TVBMCVTVFGTVTB";
var splitted = Enumerable.Range(0, s.Length)
                         .GroupBy(x => x / 2)
                         .Select(x => new string(x.Select(y => s[y]).ToArray()))
                         .ToList();

<强> 2)

string s = "ABCDEFGHIJKLMN";
var splitted = Enumerable.Range(0, (s.Length + 1) / 2)
                         .Select(i => 
                                 s[i * 2] + 
                                 ((i * 2 + 1 < s.Length) ? 
                                 s[i * 2 + 1].ToString() : 
                                 string.Empty))
                         .ToList();

答案 2 :(得分:2)

如果您真的想避免使用索引......

您可以使用正则表达式“\ w \ w”或“\ w {2,2}”或类似的变体和MSDN - Regex.Matches method来获取MatchCollection,其中包含匹配的字符对。在正则表达式模式中更改\ w以满足您的需求。

答案 3 :(得分:1)

将字符串转换为char数组,然后沿着用字符对形成新字符串进行迭代。

答案 4 :(得分:1)

List<string> result = new List<string>();

while (original.Length > 0)
{
    result.Add(new String(original.Take(2).ToArray()));
    original = new String(original.Skip(2).ToArray());
}

return result;

LINQ可能在内部某处使用索引,但我没有触及它们中的任何一个,所以我认为这是有效的。它也适用于奇数长度的原件。

编辑:

感谢 Heinzi 进行更正。演示:http://rextester.com/MWCKYD83206

答案 5 :(得分:0)

1)将列表分成对

var s = "TVBMCVTVFGTVTB";
var pairs = Enumerable.Range(0, s.Length / 2)
                      .Select(i => String.Concat(s.Skip(i * 2).Take(2)));

如果您知道s总是长度均匀,或者您不接受或不关心,以奇数长度的字符串结尾为单身,那么这将有效。

2)将列表拆分成对 - 包括任何单例余数

如果你想包括单身余数,对于奇数长度的字符串,你可以简单地使用天花板:

var s = "TVBMCVTVFGTVTB";
var pairs = Enumerable.Range(0, (int)Math.Ceiling(s.Length / 2D))
                      .Select(i => String.Concat(s.Skip(i * 2).Take(2)));