2010-02-26 136 views
6

我有一个返回匿名类型的LINQ语句。我需要在我的Silverlight应用程序中将此类型设置为ObservableCollection。但是,最接近我可以得到它C# - 将匿名类型转换为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 

如何从一个匿名类型去一个观察的集合?

谢谢

回答

6

至于郑伊健建议,您可以编写一个通用方法,将任何IEnumerable<T>转换为ObservableCollection<T>。与使用构造函数创建ObservableCollection的新实例相比,这有一个显着的优势 - C#编译器能够在调用方法时自动推断泛型类型参数,因此不需要编写元素的类型。这允许您创建匿名类型的集合,这是不可能的(例如,在使用构造函数时)。

艾金版本的一个改进是将该方法写为扩展方法。经过通常的命名模式(如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(); 
+0

有没有办法做到这一点,而不使用泛型?我的意思是,使用内联代码而不创建实际类型。就像ObservableCollection ? – v1n1akabozo 2016-06-12 16:20:03

0

确保你的对象是一个ObservableCollection确实?如果是的话,你可以只投:visibleTasks = (ObservableCollection)filteredResults;

1

你就应该能够做到这一点:

visibleTasks = new ObservableCollection<MyTasks>(filteredResults); 
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)); 
} 
0

尝试:

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

(filteredResults将包含所需的列表)