2010-02-28 2 views
5

У меня есть оператор LINQ, который возвращает неявный тип. Мне нужно, чтобы этот тип был ObservableCollection в моем приложении Silverlight 3. Конструктор ObservableCollection в Silverlight 3 предоставляет только пустой конструктор. Из-за этого я не могу напрямую преобразовать свои результаты в ObservableCollection. Вот мой код:C# - Преобразование Implict Type в ObservableCollection

ObservableCollection<MyTasks> visibleTasks = e.Result; 
var filteredResults = from visibleTask in visibleTasks 
         select visibleTask; 

filteredResults = filteredResults.Where(p => p.DueDate == DateTime.Today); 
visibleTasks = filteredResults.ToList(); // This throws a compile time error 

Как я могу перейти от неявной типизированной переменной к наблюдаемой коллекции?

Спасибо

ответ

5

Вы можете добавить элементы вручную, как это:

visibleTasks = new ObservableCollection<MyTasks>(); 
foreach(var item in filteredResults) 
    visibleTasks.Add(item); 

Вы можете сделать это в одной строке, используя следующий метод расширения:

///<summary>Adds zero or more items to a collection.</summary> 
public static void AddRange<TItem, TElement>(this ICollection<TElement> collection, IEnumerable<TItem> items) 
    where TItem : TElement { 
    if (collection == null) throw new ArgumentNullException("collection"); 
    if (items == null) throw new ArgumentNullException("items"); 

    foreach (var item in items) 
     collection.Add(item); 
} 

visibleTasks = new ObservableCollection<MyTasks>(); 
visibleTasks.AddRange(filteredResults); 
1

Используйте ObservableCollection<T> конструктор, который принимает IEnumerable<T>:

ObservableCollection<MyTasks> visibleTasks = e.Result; 
var filteredResults = from visibleTask in visibleTasks 
         select visibleTask; 

filteredResults = filteredResults.Where(p => p.DueDate == DateTime.Today); 
visibleTasks = new ObservableCollection<MyTasks>(filteredResults); // This throws a compile time error 
+0

Этот конструктор недоступен в Silverlight. http://msdn.microsoft.com/en-us/library/ms653201%28VS.95%29.aspx – SLaks

+1

argh ... из-за таких вещей, которые я не разрабатываю в Silverlight, это так * разочарование ... –

2

Вы можете написать метод расширения, который преобразует перечисление к ObservableCollection, например, так:

public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> source) 
{ 
    ObservableCollection<T> obsColl = new ObservableCollection<T>(); 
    foreach (T element in source) 
    { 
    obsColl.Add(element); 
    } 
    return obsColl; 
} 

Теперь вы можете вызвать следующее заявление:

visibleTasks = filteredResults.ToObservableCollection(); 
+0

чтобы сделать это достоверный методом расширения на IEnumerable метод PARAMS должен быть определен как: общественных статический ObservableCollection ToObservableCollection (это IEnumerable источника) – Aaron

+0

к сожалению, вы правы, исправленным. – GreenIcicle

Смежные вопросы