[英]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.