как найти самую длинную строку в строке[] с помощью 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[] 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)