簡體   English   中英

循環遍歷char []或substring():C#中的效率?

[英]looping over char[] or substring(): Efficiency in C#?

你們中的任何人都知道什么會更好:

一種。 獲取一個字符串s ,轉換為char數組並循環遍歷它,或者

得到一個字符串s ,循環它的子串( s.Substring(i, 1) )?

任何提示非常感謝。

選項b) ,循環子串,是非常低效的。

最快的方法是

c)使用只讀索引器屬性直接遍歷字符串字符:

for (int i = 0; i < s.Length; i++) { char c = s[i]; ... }

或者,基於IEnumerable<char>接口:

foreach(char c in s) { ... }

(A)效率更高。 但為什么不這樣做:

foreach (char c in s)

一些快速基准測試表明,這是一個微不足道的(差異<2%)效率低於

for(int i = 0; i < s.Length; ++i)
    char c = s[i];

但我的觀點是,前者的可讀性使其優於除了時間最關鍵的代碼之外的任何東西。

這取決於你想要做什么。

您是否只需要檢查特定索引處的字符,或者根據它們創建新字符串或什么?

記住SubString()將返回一個新字符串。 這可能會導致不必要的開銷,具體取決於您嘗試執行的操作。 更清楚地解釋這個問題會有所幫助。

另外,不要預先優化。 以您感覺更高效的方式編寫代碼。 然后對其進行分析並解決此問題,如果它導致瓶頸。

用研究和/或等待答案的方式用一些大字符串來描述這兩個例程會更快,但如果我不得不猜測我會下注A

b聽起來很奇怪。 只是猜測, 聲音更快,當然也更容易理解。

編輯:因此,如果你想要索引,你老了

for (int i = 0; i < s.Length; i++)
  //Do something with s[i]

會好起來的

或者,對於一些LINQ矯枉過正

s.Select((i, c) => //i being index, c the char, or the other way round, I forget at times);

為什么要將字符串轉換為char數組? String類上有一個索引器,可以讓你獲得各個字符:

char c = s[i];

究竟在做什么? 當你正在執行的字符串操作有一個優化的方法時,它將超出你提出的任何類型的循環。 舉個簡單的例子:

File.ReadAllLines(...);
...
Regex exp = new Regex(..., RegexOptions.Compiled);
foreach (line)
    exp.Match(...);

得多:

File.ReadAllText(...);
...
foreach (match in Regex.Match(..., RegexOptions.Multiline))
    ...

雖然使用子串記住它會給你新的字符串orignal字符串將保持原樣。我想說orignal字符串將保持原樣,因為.NET中斷其字符串,所以未來的實例將拉出相同的不可變字符串實習池,任何性能打擊都可以忽略不計。 在計算機科學中,字符串實習是一種只存儲每個不同字符串值的一個副本的方法,該字符串值必須是不可變的。 實習字符串使得一些字符串處理任務更加節省時間或空間,代價是在創建或實現字符串時需要更多時間。 不同的值存儲在字符串實習池中。 每個字符串的單個副本稱為“實習生”,通常由字符串類的方法查找。 因此,每次創建新字符串時都使用子字符串而不是子字符串選擇for循環選項。

string str = "TestString";
for (int i = 0; i < str.Length; i++)
{
    char c = str[i];
}

暫無
暫無

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

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