我在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 :(得分: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
。)
在内存方面效率更高,但从根本上说, 必须从磁盘读取每一行,而 需要迭代这些行才能查找最大长度。磁盘访问可能是当然的瓶颈。
答案 1 :(得分:3)
如果不是更好,效率肯定不会更糟。
但如果您希望简洁,请尝试使用LINQ的lambdas:
lines.Aggregate((a, b) => Math.Max(a.Length, b.Length));
顺便说一句,小点:如果剩下的数据量小于您找到的最长行数,您可以在技术上停止阅读。所以你可以从技术上保存一些步骤,虽然它可能不值得代码。
完全不相关,但仅仅因为我觉得它,这是(优雅!)Scheme版本:
(reduce max (map length lines))