как найти самую длинную строку в строке[] с помощью LINQ

У меня есть массив строк переменной длины. В настоящее время у меня есть цикл, который перебирает массив, чтобы найти самую длинную строку в массиве. Есть ли способ использовать LINQ, чтобы написать его более эффективным и / или более чистым способом?

6 ответов


это не будет намного эффективнее, однако было бы немного чище сделать что-то вроде:

var strings = new string[] { "1", "02", "003", "0004", "00005" };

string longest = strings.OrderByDescending( s => s.Length ).First();

выход: 00005


strings.Aggregate(string.Empty, (seed, f) => f.Length > seed.Length ? f : seed);

агрегатный синтаксис немного сложнее читать, чем другие методы, но, строго говоря, он более эффективен, чем другие подходы, которые я вижу здесь, поскольку он не требует сортировки. Просто реализация O(N).

EDIT: этот подход, наряду с большинством других здесь, предполагает, что в вашем списке нет нулевых значений, чтобы f.Длина бросьте исключение null ref. Быстрый троичный оператор (f != null ? f.Длина: 0) исправил бы это, если бы это было действительно для вашего перечислимый.


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

таким образом, код явно получает строку с максимальной длиной.


хотя это старый вопрос, я хотел бы добавить, что самый эффективный ответ не предоставляется. Это не один лайнер, но он самый быстрый и возвращает коллекцию самых длинных строк, которые OrderBy или Aggregate не предоставляют. Мэтт Эллен был ближе всего с его ответом, но использование Макса в его Where делает его довольно медленным, когда вы работаете с большой коллекцией.

правильный ответ должен быть:

int maxLength = collection.Max(x => x.Length);
string[] longestStrings = collection.Where(x => x.Length == maxLength);

рассмотреть вопрос об использовании ?. (в C# 6.0) и ?? операторы для проверки значений null, если ваша коллекция может содержать их.


У меня сейчас нет компилятора, но это также будет работать.

string[] arr = new string[] { "a", "aa", "aaa" };
var longest = arr.Max(w => w.Length)