2013-04-30 3 views
1

У меня возникла проблема с объединением двух запросов LINQ.Согласование запроса LINQ и оператора сортировки LINQ

В настоящее время мой (оригинал) код выглядит следующим образом

s.AnimalTypes.Sort((x, y) => string.Compare(x.Type, y.Type)); 

Что я нуждаясь сделать, это изменить это на основе даты, а затем выберите все данные прошлых этой даты, так что я

s.AnimalTypes.Select(t=>t.DateChanged > dateIn).ToList() 
s.AnimalTypes.Sort((… 

Это не выглядит правильным, поскольку оно не сортирует выбранные данные, а сортирует все в s.AnimalTypes.

Есть ли способ объединить две линии LINQ? Я пробовал

s.AnimalTypes.Select(t=>t.DateChanged > dateIn).ToList().Sort((… 

но это дает мне ошибку в разделе «Сортировка».

Есть ли простой способ сделать это? Я осмотрелся, и Grouo и OrderBy продолжают возникать, но я не уверен, что это то, что мне нужно здесь.

Благодаря

+0

Какая ошибка? – agAus

ответ

1

Из вашего описания, я полагаю, вы хотите что-то вроде:

var results = s.AnimalTypes.Where(t => t.DateChanged > dateIn).OrderBy(t => t.Type); 

Вы можете позвонить ToList() преобразовать в List<T> в конце, если это необходимо.

Есть несколько основных понятий, я полагаю, вам не хватает здесь -

Во-первых, в отличие от List<T>.Sort, методы расширения LINQ не изменяют оригинальные коллекции, а возвращает новый IEnumerable<T> с отфильтрованный или отсортированные результаты. Это означает, что вам всегда нужно присваивать что-либо возвращаемому значению (следовательно, мой var results = выше).

Во-вторых, Select выполняет операцию сопоставления - преобразование данных из одной формы в другую. Например, вы можете использовать его для извлечения DateChanged (Select(t => t.DateChanged)), но это даст вам список дат, а не исходные типы животных. Чтобы фильтровать или ограничивать список предикатом (критериями), вместо этого вы должны использовать Where.

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

+0

Спасибо, вы объяснили, где я пошла не так чудесно. Код теперь работает так, как должен :) – Nodoid

0

Вы используете Select, когда на самом деле хотите использовать Where.

Select является проекцией из одной коллекции из одного типа в другой тип - не будет увеличивать или уменьшать количество элементов в коллекции с помощью Select, но вместо этого можно выбрать имя каждого объекта или какой-либо другой собственности ,

Where - это то, что вы хотели бы использовать для фильтрации коллекции на основе булевого предиката.

Смежные вопросы