C#字符在字符串中计数并在字符串中添加句点

时间:2010-12-16 18:20:35

标签: c#

这个很简单,但我不知道如果没有foreach遍历每一行,该怎么做。

我想要做的是在每个字符串中的第6个字符后面放一个句点(.)。

输入:

ads234adf4234asd  
dfasd234asdf45  
rte3443  
fdf323ggt  
vgdfg767575  
sdgsdfgdfg756756    

输出:

ads234.adf4234asd  
dfasd2.34asdf45  
rte344.3  
fdf323.ggt  
vgdfg7.67575  
sdgsdf.gdfg756756

我该怎么做?

8 个答案:

答案 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, ".");