C # - конвертировать анонимный тип в наблюдаемую коллекцию - PullRequest
7 голосов
/ 26 февраля 2010

У меня есть оператор LINQ, который возвращает анонимный тип. Мне нужно, чтобы этот тип был ObservableCollection в моем приложении Silverlight. Тем не менее, ближе всего я могу получить его до

Список myObjects;

Может кто-нибудь сказать мне, как это сделать?

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 ]

6 голосов
/ 26 февраля 2010

Как предполагает Экин, вы можете написать универсальный метод, который превращает любой IEnumerable<T> в ObservableCollection<T>. Это имеет одно существенное преимущество перед созданием нового экземпляра ObservableCollection с использованием конструктора - компилятор C # может автоматически выводить параметр универсального типа при вызове метода, поэтому вам не нужно писать тип элементов. Это позволяет вам создавать коллекцию анонимных типов, что иначе было бы невозможно (например, при использовании конструктора).

Одним из улучшений по сравнению с версией Экина является написание метода как метода расширения. Следуя обычному шаблону именования (например, ToList или ToArray), мы можем назвать его ToObservableCollection:

static ObservableCollection<T> ToObservableCollection<T> 
  (this IEnumerable<T> en) { 
    return new ObservableCollection<T>(en); 
} 

Теперь вы можете создать наблюдаемую коллекцию, содержащую анонимные типы, возвращаемые из запроса LINQ, например:

var oc = 
  (from t in visibleTasks   
   where t.IsSomething == true
   select new { Name = t.TaskName, Whatever = t.Foo }
  ).ToObservableCollection();
2 голосов
/ 26 февраля 2010

Примерно так будет работать с использованием функций вывода типов:

private static ObservableCollection<T> CreateObservable<T>(IEnumerable<T> enumerable)
{
    return new ObservableCollection<T>(enumerable);
}

static void Main(string[] args)
{

    var oc = CreateObservable(args.Where(s => s.Length == 5));
}
1 голос
/ 26 февраля 2010

Вы должны просто быть в состоянии сделать это:

visibleTasks = new ObservableCollection<MyTasks>(filteredResults);
0 голосов
/ 23 мая 2012

Попробуйте:

var filteredResults = from visibleTask in visibleTasks
                      where(p => p.DueDate == DateTime.Today)
                      select visibleTask).ToList(); 

(FilterResults будет содержать желаемый список)

0 голосов
/ 26 февраля 2010

Вы уверены , что ваш объект действительно ObservableCollection? Если да, вы можете просто разыграть: visibleTasks = (ObservableCollection)filteredResults;

...