这个很简单,但我不知道如果没有foreach
遍历每一行,该怎么做。
我想要做的是在每个字符串中的第6个字符后面放一个句点(.
)。
输入:
ads234adf4234asd dfasd234asdf45 rte3443 fdf323ggt vgdfg767575 sdgsdfgdfg756756
输出:
ads234.adf4234asd dfasd2.34asdf45 rte344.3 fdf323.ggt vgdfg7.67575 sdgsdf.gdfg756756
我该怎么做?
答案 0 :(得分:3)
对于每个字符串,您可以使用string.Insert
来获得所需的结果:
string s = "ads234adf4234asd";
s = s.Insert(6, ".");
如果你想避免编写一个显式的for循环,你可以尝试LINQ:
string[] result = lines
.Select(s => s.Insert(6, "."))
.ToArray();
请注意,这可以避免foreach
,但不会避免循环 - 在Select的实现中仍然存在循环。
如果您不希望程序在收到长度为5或更短的字符串时崩溃,但只是为了保持字符串不变,那么试试这个:
string[] result = lines
.Select(s => s.Length >= 6 ? s.Insert(6, ".") : s)
.ToArray();
答案 1 :(得分:1)
以下RegEx将插入一个。在每行的第6个字符之后:
Regex.Replace(yourInputString, "^(?<before>.{6})(?<after>.*)$", @"${before}.${after}", RegexOptions.Multiline);
答案 2 :(得分:0)
您可以使用模数运算符来实现此目的。 e.g。
string myString = "abcdefghijklmnopqrstuvwxyz";
string newString = "";
for (int i = 0; i < myString.Length; i++)
{
if (i !=0 && i % 6 == 0)
{
newString += ".";
}
newString += myString[i];
}
答案 3 :(得分:0)
我根本看不到一种不循环的方法 - 如果你把它存储为一个char数组,你可以逐步遍历每个char并在你找到的每个返回/换行符后插入一个6个字符的字符。
编辑:可能误解了foreach循环每一行...你的意思是foreach从一行到另一行循环,或者循环遍历每一行中的字符?
答案 4 :(得分:0)
未经测试,但是此可能有效:
string field = "ads234adf4234asd";
int i = 0;
while ((i += 6) < field.Length)
field = field.Insert(i, ".");
经过更正测试。
或者,如果仅在第6次之后:
string field = "ads234adf4234asd";
if (field.Length >= 6)
field = field.Insert(6, ".");
答案 5 :(得分:0)
好吧,如果你将字符串的长度除以6就知道要添加多少个句点。所以......
// -1 to account for i = 6 in the loop to start
int numPeriods = ( str.Length / 6 ) - 1;
// we increment the index by 7 to account for the period we added
for( int index = 6, i = 0; i < numPeriods; index += 7, ++i )
{
str = str.Insert( index, "." );
}
我确信有更优雅的方式,但我必须重新开始工作!
此外,您的书面请求和您的示例不是一回事。你说
我想要做的是在字符串中的每个第6个字符后面放一个'。'
但是您的示例显示为每个行在索引6处添加句点。这是什么?
答案 6 :(得分:0)
我将重复使用我之前介绍过的将IEnumerable<T>
分解为页面的代码:
static class EnumerableExtensions {
public static IEnumerable<IEnumerable<T>> GetPages<T>(
this IEnumerable<T> source,
int pageSize
) {
var e = source.GetEnumerator();
while (e.MoveNext()) {
int count = pageSize - 1;
List<T> list = new List<T>(pageSize) { e.Current };
while (count > 0 && e.MoveNext()) {
list.Add(e.Current);
count--;
}
yield return list;
}
}
}
然后:
string s = "ads234adf4234asd";
var pages = s.GetPages(6);
string result = String.Join(".", pages.Select(a => new string(a.ToArray())));
当然,那里埋藏着一些我不能理解你想要避免的循环。但是,如果你真的必须避免循环,你可以递归地执行此操作:
static string SplitAndInsert(string s, int afterEvery, char insertCharacter) {
if (s.Length < afterEvery) {
return s;
}
else {
return
s.Substring(0, afterEvery) +
insertCharacter +
SplitAndInsert(
s.Substring(afterEvery, s.Length - afterEvery),
afterEvery,
insertCharacter
);
}
}
答案 7 :(得分:0)
我认为循环是最好的方法,也许你可以用LINQ使代码更清晰:
var linq = from text in strings
where text.Length > 6
select text.Insert(6, ".");