Подтвердить что ты не робот

Передача результата LINQ в ObservableCollection

Тот факт, что это результат LINQ, возможно, не относится к вопросу, но я все равно упоминаю об этом, так как это контекст, который привел к этому вопросу.

Я запускаю запрос LINQ. Результатом является;

IEnumerable<MyClass> 

Я хочу поместить результат в ObservableCollection;

ObservableCollection<MyClass> 

Как это сделать? (без прогона IEnumerable и копирования элементов ObservableCollection). Я замечаю, что у LINQ есть несколько функций To..(), но, похоже, это не помогает мне для этого актера.?

4b9b3361

Ответ 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. Но база кода не трудно расширить.