2010-07-15 1 views
5

В моем приложении WPF я хотел бы использовать LINQ как можно больше (особенно, чтобы избежать foreach). Но WPF много работает с ObservableCollection, и я не могу использовать LINQ с такой коллекцией. Что я могу сделать?WPF LINQ и ObservableCollection

ответ

8

Что заставляет вас думать, что вы не можете использовать LINQ с ObservableCollection<T>? Он реализует Collection<T>, поэтому все должно быть хорошо.

Например:

using System; 
using System.Collections.ObjectModel; 
using System.Linq; 

class Test 
{ 
    static void Main() 
    { 
     var collection = new ObservableCollection<int>() 
     { 
      1, 2, 3, 6, 8, 2, 4, 5, 3 
     }; 

     var query = collection.Where(x => x % 2 == 0); 
     foreach (int x in query) 
     { 
      Console.WriteLine(x); 
     } 
    } 
} 
+0

Спасибо. Сожалею. Я помню, что были проблемы с некоторыми запросами, но теперь я пробовал и все работает. – lamarmora

+1

Результирующий запрос - это IEnumerable. Есть ли чистый способ вернуться в ObservableCollection ? – tofutim

+0

@tofutim: Нет, не настолько, насколько мне известно, я боюсь. –

13

Просто для кого-то, кто может прийти через этот вопрос с попыткой фильтровать ObservableCollection, но считают, что они не могут.

Jon абсолютно прав в том, что нет причин, по которым вы не можете этого сделать, но ключевой момент для новичков или для тех, кто разрабатывал WPF на некоторое время, заключается в том, что вам нужно включить «используя System.Linq; " пространство имен. Как только вы это сделаете, вы можете сделать запрос «.where» на свой объект.

+0

Это правда, и это сработало для меня. – dev1998

+0

Спасибо за дополнительный ответ! * Это * была моей проблемой :) – derekantrican

+1

Получившийся ObservableCollection не будет обновляться, если обновление результата запроса станет следствием обновления исходного источника. – Tormod

0

ОП запросил особенно для метода LINQ «.ForEach()», который нельзя использовать для ObservableCollection < T>, поскольку он реализован только для списка < T>.

Существует другой SO-Topic, где я нашел свое решение: https://stackoverflow.com/a/200584/2408978