как найти самую длинную строку в строке [] с помощью LINQ - PullRequest
18 голосов
/ 29 июня 2011

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

Ответы [ 6 ]

41 голосов
/ 29 июня 2011

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

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

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

Выход: 00005

13 голосов
/ 14 августа 2014
strings.Aggregate(string.Empty, (seed, f) => f.Length > seed.Length ? f : seed);

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

РЕДАКТИРОВАТЬ: Этот подход, как и большинство других здесь, предполагает, что в вашем списке нет нулевых значений, иначе f.Length выдает исключение null ref.Быстрый троичный оператор (f! = Null? F.Length: 0) исправил бы это, если бы он был допустимым для вашего перечислимого.

9 голосов
/ 29 июня 2011
string [] strings;
return strings.OrderByDescending (s => s.Length).First ();
2 голосов
/ 30 октября 2015

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

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

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

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

2 голосов
/ 29 июня 2011
string[] arr = new string[] { "a", "aa", "aaa" };

var longest = arr.Where(s => s.Length == arr.Max(m => m.Length)).First();

output aaa

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

0 голосов
/ 22 мая 2013

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

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