2011-04-08 129 views
7

我有一個C#中的字符串的集合。我的代碼如下所示:C#:如何獲得字符串中的字符串的長度[]

string[] lines = System.IO.File.ReadAllLines(@"d:\SampleFile.txt"); 

我想要做的是找到該集合中字符串的最大長度並將其存儲在變量中。目前,我手動編碼,如?

int nMaxLengthOfString = 0; 
for (int i = 0; i < lines.Length;i++) 
{    
    if (lines[i].Length>nMaxLengthOfString) 
    { 
     nMaxLengthOfString = lines[i].Length; 
    } 
} 

上面的代碼確實對我的工作,但我尋找一些內置的功能,以保持效率,因爲會有線的千元MYFILE :(

+0

AFAIK - 沒有內置的功能來做到這一點。但是,他們可能會用其他方式來編寫相同的東西。例如。使用LINQ或使用Max函數....不直接與C#相關,但在Python中有相同主題的線程 - 您可以閱讀如果以供參考:http://stackoverflow.com/questions/1292630/how-to-打開文件並找到最長的行然後打印輸出 – sajoshi 2011-04-08 05:52:10

回答

17

與LINQ一個更簡單的方法是:

int maxLength = lines.Max(x => x.Length); 

注如果您使用的是.NET 4,則不需要先將所有行讀入數組中,如果以後不需要它們:

// Note call to ReadLines rather than ReadAllLines. 
int maxLength = File.ReadLines(filename).Max(x => x.Length); 

(如果你不使用.NET 4中,很容易寫的File.ReadLines等價物。)

這將是在內存方面更有效,但根本上,你會閱讀每一行從磁盤,你需要遍歷這些行來找到最大長度。磁盤訪問當然可能是瓶頸。

+0

我做了*不知道Max的重載...... :) – Mehrdad 2011-04-08 05:44:27

+0

你只需要快! – 2011-04-08 05:48:07

3

效率肯定不會你的情況是更糟,如果沒有更好的

但是,如果你正在尋找是簡潔,嘗試用lambda表達式LINQ:

lines.Aggregate((a, b) => Math.Max(a.Length, b.Length)); 

順便說一句,小技巧:如果剩餘的數據量小於您找到的最長的行,您可以在技術上停止閱讀。所以你可以在技術上保存一些步驟,雖然它可能不值得代碼。


完全無關,而是因爲我喜歡它的感覺,這裏的(優雅!)計劃版本:

(reduce max (map length lines))