2010-02-26 138 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將包含所需的列表)