Приведите результат LINQ к ObservableCollection
тот факт, что это результат LINQ, возможно, не имеет отношения к вопросу, но я все равно упоминаю об этом - поскольку это контекст, который привел к этому вопросу.
Я запускаю запрос LINQ. В результате получается;
IEnumerable<MyClass>
Я хочу поместить результат в ObservableCollection;
ObservableCollection<MyClass>
Как мне сделать этот бросок? (без выполнения IEnumerable и копирования элементов в ObservableCollection). Я заметил, что у LINQ есть несколько К..() функции, но это, кажется, не помогает мне для этого броска..?
5 ответов:
просто использовать:
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); }
var linqResults = foos.Where(f => f.Name == "Widget"); var observable = new ObservableCollection<Foo>(linqResults);
можно использовать
ObservableCollectionконструктор для этого:ObservableCollection<MyClass> obsCol = new ObservableCollection<MyClass>(myIEnumerable);
IEnumerable это только интерфейс.
вам нужно будет скопировать содержимое из IEnumerable в ObservableCollection. Вы можете сделать это, передав свой IEnumerable в конструктор ObersvableCollection при создании нового
Я написал эту библиотеку несколько лет назад.
https://github.com/wasabii/OLinq
Он не делает именно то, что вы, вероятно, хотите, он делает больше. Это поставщик запросов Linq, который анализирует дерево выражений, присоединяется к ссылочным коллекциям и предоставляет другую коллекцию, которая выдает события при изменениях.
не хватает нескольких операторов Linq. Но базу кода не трудно расширить.
Comments