有没有办法在不查看索引的情况下将字符串分成几对?例如 TVBMCVTVFGTVTB将被分成一个字符串列表:
[TV,BM,CV,电视,FG,电视,TB]
也许我应该说问题是,当使用字符串将它们分成组时,它是一个类似于string.join或string.split的函数。
答案 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)
var s = "TVBMCVTVFGTVTB";
var pairs = Enumerable.Range(0, s.Length / 2)
.Select(i => String.Concat(s.Skip(i * 2).Take(2)));
如果您知道s
总是长度均匀,或者您不接受或不关心,以奇数长度的字符串结尾为单身,那么这将有效。
如果你想包括单身余数,对于奇数长度的字符串,你可以简单地使用天花板:
var s = "TVBMCVTVFGTVTB";
var pairs = Enumerable.Range(0, (int)Math.Ceiling(s.Length / 2D))
.Select(i => String.Concat(s.Skip(i * 2).Take(2)));