Передача результата LINQ в ObservableCollection
Тот факт, что это результат LINQ, возможно, не относится к вопросу, но я все равно упоминаю об этом, так как это контекст, который привел к этому вопросу.
Я запускаю запрос LINQ. Результатом является;
IEnumerable<MyClass>
Я хочу поместить результат в ObservableCollection;
ObservableCollection<MyClass>
Как это сделать? (без прогона IEnumerable и копирования элементов ObservableCollection). Я замечаю, что у LINQ есть несколько функций To..(), но, похоже, это не помогает мне для этого актера.?
Ответы
Ответ 1
Просто используйте:
ObservableCollection<Foo> x = new ObservableCollection<Foo>(enumerable);
Это сделает необходимое копирование. Нет никакого способа наблюдать за изменениями в реальном запросе - хотя идея ObservableQuery<T>
является интересной (хотя и сложной).
Если вы хотите использовать метод расширения, это просто:
public static ObservableCollection<T> ToObservableCollection<T>
(this IEnumerable<T> source)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return new ObservableCollection<T>(source);
}
Ответ 2
var linqResults = foos.Where(f => f.Name == "Widget");
var observable = new ObservableCollection<Foo>(linqResults);
Ответ 3
Для этого можно использовать конструктор ObservableCollection
:
ObservableCollection<MyClass> obsCol =
new ObservableCollection<MyClass>(myIEnumerable);
Ответ 4
IEnumerable - это только интерфейс.
Вам нужно будет скопировать содержимое из IEnumerable в ObservableCollection. Вы можете сделать это, передав свой IEnumerable в конструктор ObersvableCollection при создании нового
Ответ 5
Я написал эту библиотеку несколько лет назад.
https://github.com/wasabii/OLinq
Это не делает то, что вы, вероятно, хотите, оно делает больше. Это поставщик запросов Linq, который анализирует дерево выражений, присоединяется к ссылочным коллекциям и предоставляет другую коллекцию, которая испускает события при изменениях.
Он пропускает несколько операторов Linq. Но база кода не трудно расширить.