C# - 将匿名类型转换为observablecollection

时间:2010-02-26 19:17:01

标签: c# linq observablecollection anonymous-types

我有一个返回匿名类型的LINQ语句。我需要在Silverlight应用程序中将此类型设置为ObservableCollection。但是,我最接近的是

列出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 个答案:

答案 0 :(得分:6)

正如Ekin建议的那样,您可以编写一个将IEnumerable<T>转换为ObservableCollection<T>的通用方法。这比使用构造函数创建ObservableCollection的新实例有一个明显的优势 - C#编译器能够在调用方法时自动推断泛型类型参数,因此您不需要编写元素的类型。这允许您创建一组匿名类型,这是不可能的(例如,当使用构造函数时)。

对Ekin版本的一个改进是将该方法编写为扩展方法。按照通常的命名模式(例如ToListToArray),我们可以将其称为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();

答案 1 :(得分:2)

这样的事情可以使用类型推断功能来完成工作:

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));
}

答案 2 :(得分:1)

你应该能够做到这一点:

visibleTasks = new ObservableCollection<MyTasks>(filteredResults);

答案 3 :(得分:0)

确定您的对象确实是ObservableCollection吗?如果是,您可以投票:visibleTasks = (ObservableCollection)filteredResults;

答案 4 :(得分:0)

尝试:

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

(filteredResults将包含您想要的列表)