2011-04-08 174 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)) 
相关问题