簡體   English   中英

C#字符在字符串中計數,並在字符串中添加句點

[英]C# character counting in a string and add in a period in a string

這真的很簡單,但是我不確定在沒有foreach循環每一行的情況下如何做到這一點。

我想做的是在每個字符串的第6個字符之后放置一個句點( . )。

輸入:

ads234adf4234asd  
dfasd234asdf45  
rte3443  
fdf323ggt  
vgdfg767575  
sdgsdfgdfg756756

輸出:

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

我怎樣才能做到這一點?

對於每個字符串,您可以使用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();

以下RegEx將插入。 每行第6個字符之后:

Regex.Replace(yourInputString, "^(?<before>.{6})(?<after>.*)$", @"${before}.${after}", RegexOptions.Multiline);

您可以使用模運算符來實現此目的。 例如

string myString = "abcdefghijklmnopqrstuvwxyz";
string newString = "";
for (int i = 0; i < myString.Length; i++)
{
    if (i !=0 && i % 6 == 0)
    {
        newString += ".";
    }
    newString += myString[i];
}

我看不到完全沒有循環的方法-如果將其存儲為單個char數組,則可以逐步執行每個char並在找到的每個return / newline char之后插入句點6個char。

編輯:可能對foreach循環每一行有誤解...您是說foreach從一行到另一行循環,還是循環遍歷每一行中的字符?

未經測試,但是t 可能 有效:

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

好吧,如果將字符串的長度除以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處添加一個句點。 哪有

我將重用先前提供的將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
                );
        }
    }

我認為循環是最好的方法,也許您可​​以使用LINQ使代碼更簡潔:

var linq = from text in strings
           where text.Length > 6
           select text.Insert(6, ".");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM