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

7
我有一条LINQ语句,可以返回一个匿名类型。我需要在我的Silverlight应用程序中将此类型转换为ObservableCollection。然而,我最接近的方式是将其转换为List 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
正如Ekin所建议的那样,您可以编写一个通用方法,将任何>转换为>。这相对于使用构造函数创建的新实例具有一个重要优点——当调用方法时,C#编译器能够自动推断泛型类型参数,因此您不需要编写元素类型。这使您能够创建匿名类型的集合,否则将无法实现(例如,使用构造函数时)。
与Ekin版本相比的一个改进是将该方法编写为扩展方法。按照常规命名模式(例如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();

有没有一种方法可以不使用泛型来完成呢?我的意思是,使用内联代码而不创建真正的类型。类似于ObservableCollection<typeof(new {Property A, Property B})>这样的东西? - v1n1akabozo

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

1

你应该可以这样做:

visibleTasks = new ObservableCollection<MyTasks>(filteredResults);

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

(filteredResults将包含您所需的列表)


0

你确定你的对象确实是一个 ObservableCollection 吗?如果是,你可以直接进行强制转换: visibleTasks = (ObservableCollection)filteredResults;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接