Подзапрос с использованием лямбда-выражения

#c# #linq #lambda

#c# #linq #лямбда

Вопрос:

Я использую подзапрос LINQ для получения всех слов минимальной длины в массиве. Я хочу сделать это с помощью лямбда-выражения.

 var names = new[] { "Tom", "Dick", "Harry", "Mary", "Jay" }.AsQueryable();
(
from n in names
where n.Length == names.Min (n2 => n2.Length)
select n
)
  

Вывод :
Том, Джей

Спасибо, Пракхар

Ответ №1:

Это сработало бы:

 var minNames = names.Where(s => s.Length == names.Min(n=>n.Length));
  

Но он оценивает минимальную длину для каждого имени в списке ( O(n*n) сложность), поэтому это было бы лучше:

 var min = names.Min(s => s.Length); //calc. this only once
var minNames = names.Where(s => s.Length == min);
  

Комментарии:

1. Против. Посмотрите интересный связанный поток, который подтверждает, что Min метод вызывается каждый раз, что приводит к O(n**2) усложнению, как вы говорите. Другой способ решения этой проблемы — int min = int.MaxValue; var minNames = names.OrderBy(s => s.Length).TakeWhile(s => min >= (min = s.Length)) но это вряд ли лучше вашего решения.

Ответ №2:

Вопрос мне кажется немного расплывчатым, но это то, что вы ищете?

  names.Where (x => x.Length == names.Min (n2 => n2.Length));
  

Ответ №3:

Это должно помочь вам:

     var minNames = names.Where(c => c.Length == names.Min(n => n.Length))
            .ToArray();