我有一個可變長度的字符串數組。目前我有一個循環遍歷數組來查找數組中最長的字符串。有什麼方法可以使用LINQ以更高效和/或更清晰的方式編寫它?如何使用LINQ找到字符串[]中最長的字符串使用LINQ
回答
這不會是更有效的,但是這將是一個有點清潔劑做這樣的事情:
var strings = new string[] { "1", "02", "003", "0004", "00005" };
string longest = strings.OrderByDescending(s => s.Length).First();
輸出:00005
string [] strings;
return strings.OrderByDescending (s => s.Length).First();
string[] arr = new string[] { "a", "aa", "aaa" };
var longest = arr.Where(s => s.Length == arr.Max(m => m.Length)).First();
輸出aaa
這種方式的代碼顯然是讓你的字符串的最大長度。
這個肯定有效。但它的O(N^2),所以它會比其他答案稍長。例如。對於5000個字符串數組'strings.OrderByDescending(s => s.Length).First();'將在我的機器上返回大約15個CPU ticks,而這需要大約390個ticks。 – vrrathod
是的,我意識到這一點。我把它說出來是因爲它說明了它在做什麼,而不是使用排序的副作用。 –
我現在沒有編譯器,但這也可以工作。
string[] arr = new string[] { "a", "aa", "aaa" };
var longest = arr.Max(w => w.Length)
這發現最大的長度,但不是字符串本身。 – Vache
strings.Aggregate(string.Empty, (seed, f) => f.Length > seed.Length ? f : seed);
總結語法稍微硬一點比其他方法來讀取,但嚴格來說,它比我在這裏看到的,因爲它不需要排序的其他方法更有效。只是一個O(N)的實現。
編輯:這種方法,以及這裏的大多數其他人在這裏假設列表中沒有空值,以免f.Length拋出一個空ref參數。一個快速的三元運算符(f!= null?f.Length:0)會修正它,如果它對你的枚舉是有效的。
我更喜歡這個答案,因爲它確實回答了提問*和*的問題,我相信這是最有效的單個項目答案時,不需要最長的單詞的整個列表*和*與額外的編輯,Caleb提到處理空字符串。兩個大拇指從我身上!爲了方便起見,下面是我測試過的代碼運行良好:'string longest = strings.Aggregate(string。空,(seed,f)=>(f == null?0:f.Length)> seed.Length? f:種子);' –
即使這是一個老問題,我想補充一點,最有效的答案是不提供的。它不是一行代碼,但它是最快的,並返回OrderBy或Aggregate不提供的最長字符串的集合。馬特埃倫與他的答案是最接近的,但在他的地方使用Max會讓你在處理大型藏品時相當緩慢。
正確的答案應該是:
int maxLength = collection.Max(x => x.Length);
string[] longestStrings = collection.Where(x => x.Length == maxLength);
考慮使用? (在C#6.0中)和?運算符檢查空值是否可以包含這些值。
更正:問題要求一個字符串不是最長字符串的列表。你的代碼在最後一個分號之前需要'.ToArray()'來編譯。但是,我的確讚揚你提供的代碼可以很容易地用來提供最長的單詞列表或者只是第一個單詞,在你的代碼末尾有一個簡單的'.FirstOrDefault()'和'.ToArray()' 。我個人更喜歡這種解決方案的靈活性,所以我最喜歡你的解決方案提供的。謝謝! –
- 1. 如何使用LINQ找到字符串列表中的子串
- 2. 使用LINQ來計數字符串中的子字符串?
- 3. 如何使用linq將字符串列表添加到字符串中?
- 4. Linq使用字符串int的查詢
- 5. 如何使用LINQ反轉字符串數組中的所有字符串?
- 6. 字符串LINQ到的IQueryable
- 7. 如何只使用linq從表中獲取最大字符串長度列行?
- 8. 使用LINQ或C#從字符串
- 9. 使用LINQ查詢字符串
- 10. 提取字符串使用LINQ
- 11. 插入Unicode字符串使用LINQ
- 12. 分割字符串使用LINQ
- 13. 使用字符串作爲LINQ查詢
- 14. 使用LINQ to從分隔字符串
- 15. LinQ將使用JSON字符串
- 16. 如何使用LINQ查找並顯示字符串中最重複的單詞?
- 17. linq到XML字符串
- 18. Linq int字符串
- 19. Linq OrderBy字符串
- 20. perl:字符串匹配找到最長的子字符串
- 21. 如何用LINQ代替字符串中的字符
- 22. 如何從asp.net mvc3中的一個長字符串中使用LINQ獲取一個短字符串?
- 23. LINQ到SQL:使用部分匹配的字符串包含字符串
- 24. 如何找到給定字符串中最長的重複子字符串
- 25. 如何找到多個字符串中最長的公共子字符串?
- 26. 使用C#,從字符串列表中,我們如何找到最接近測試字符串的字符串?
- 27. 找到最長的字符串前綴
- 28. 找到字符串中的所有字符串,並使用它
- 29. 如何在字符串中使用php查找字符串
- 30. 在LINQ應用子字符串到SQL
太棒了!謝謝,我已經使用FirstOrDefault()。它確實看起來更清潔,但在性能方面有沒有優勢? – vrrathod
@vrrathod沒有性能上的提升,它仍然在執行相同的迭代邏輯,它只是一個更簡潔的語法,這正是LINQ的全部內容。 –
它確實做同樣的事情。這是我測試的方式。我生成了5000個字符串的數組。 LINQ在我的機器上大約需要15個cpu。我寫了一個比較長度的字符串的老式循環。它返回0滴答。差異我猜是排序。 – vrrathod