В моем приложении WPF я хотел бы использовать LINQ как можно больше (особенно, чтобы избежать foreach
). Но WPF много работает с ObservableCollection, и я не могу использовать LINQ с такой коллекцией. Что я могу сделать?WPF LINQ и ObservableCollection
ответ
Что заставляет вас думать, что вы не можете использовать 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);
}
}
}
Просто для кого-то, кто может прийти через этот вопрос с попыткой фильтровать ObservableCollection, но считают, что они не могут.
Jon абсолютно прав в том, что нет причин, по которым вы не можете этого сделать, но ключевой момент для новичков или для тех, кто разрабатывал WPF на некоторое время, заключается в том, что вам нужно включить «используя System.Linq; " пространство имен. Как только вы это сделаете, вы можете сделать запрос «.where» на свой объект.
Это правда, и это сработало для меня. – dev1998
Спасибо за дополнительный ответ! * Это * была моей проблемой :) – derekantrican
Получившийся ObservableCollection не будет обновляться, если обновление результата запроса станет следствием обновления исходного источника. – Tormod
ОП запросил особенно для метода LINQ «.ForEach()», который нельзя использовать для ObservableCollection < T>, поскольку он реализован только для списка < T>.
Существует другой SO-Topic, где я нашел свое решение: https://stackoverflow.com/a/200584/2408978
Спасибо. Сожалею. Я помню, что были проблемы с некоторыми запросами, но теперь я пробовал и все работает. – lamarmora
Результирующий запрос - это IEnumerable. Есть ли чистый способ вернуться в ObservableCollection? –
tofutim
@tofutim: Нет, не настолько, насколько мне известно, я боюсь. –