У меня есть массив строк переменной длины. В настоящее время у меня есть цикл, который выполняет итерацию через массив, чтобы найти самую длинную строку в массиве. Можно ли использовать LINQ для более эффективного и/или более чистого способа?
Как найти самую длинную строку в строке [], используя LINQ
Ответ 1
Это будет не намного эффективнее, однако было бы немного более чистым сделать что-то вроде:
var strings = new string[] { "1", "02", "003", "0004", "00005" };
string longest = strings.OrderByDescending( s => s.Length ).First();
Выход: 00005
Ответ 2
strings.Aggregate(string.Empty, (seed, f) => f.Length > seed.Length ? f : seed);
Агрегатный синтаксис немного сложнее читать, чем другие методы, но, строго говоря, он более эффективен, чем другие подходы, которые я вижу здесь, поскольку он не требует сортировки. Просто реализация O (N).
EDIT: этот подход, как и большинство других, предполагает, что в вашем списке нет нулевых значений, чтобы f.Length не выбрала исключение null ref. Быстрый тернарный оператор (f!= Null? F.Length: 0) исправит это, если он был действителен для вашего перечисляемого.
Ответ 3
string [] strings;
return strings.OrderByDescending (s => s.Length).First ();
Ответ 4
string[] arr = new string[] { "a", "aa", "aaa" };
var longest = arr.Where(s => s.Length == arr.Max(m => m.Length)).First();
вывод aaa
Таким образом, код явно дает вам строку с максимальной длиной.
Ответ 5
Хотя это старый вопрос, я хотел бы добавить, что самый эффективный ответ не предоставляется. Это не один лайнер, но он самый быстрый и возвращает коллекцию самых длинных строк, которые не предоставляют OrderBy или Aggregate. Мэтт Эллен был самым близким с его ответом, но использование Макса в его "Где" делает его довольно медленным, когда вы работаете с большой коллекцией.
Правильный ответ должен быть:
int maxLength = collection.Max(x => x.Length);
string[] longestStrings = collection.Where(x => x.Length == maxLength).ToArray();
Рассмотрите возможность использования? (в С# 6.0) и?? операторы для проверки на нулевые значения, если ваша коллекция может содержать их.
Ответ 6
У меня нет компилятора прямо сейчас, но это также сработает.
string[] arr = new string[] { "a", "aa", "aaa" };
var longest = arr.Max(w => w.Length)