2010-02-26 13 views
6

Tôi có một câu lệnh LINQ trả về một kiểu ẩn danh. Tôi cần phải nhận loại này là ObservableCollection trong ứng dụng Silverlight của mình. Tuy nhiên, gần nhất tôi có thể lấy nó đến một sốC# - chuyển đổi loại vô danh thành observablecollection

Liệt kê myObjects;

Ai đó có thể cho tôi biết cách thực hiện việc này không?

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 

Làm cách nào để chuyển từ một loại ẩn danh sang bộ sưu tập có thể quan sát?

Cảm ơn bạn

Trả lời

6

Như Ekin gợi ý, bạn có thể viết một phương pháp chung để biến bất kỳ IEnumerable<T> thành một ObservableCollection<T>. Điều này có một lợi thế đáng kể so với việc tạo một cá thể mới của ObservableCollection bằng cách sử dụng hàm tạo - trình biên dịch C# có thể suy ra tham số kiểu chung tự động khi gọi một phương thức, do đó bạn không cần phải viết loại phần tử. Điều này cho phép bạn tạo một bộ sưu tập các loại ẩn danh, sẽ không thể nếu không (ví dụ: khi sử dụng hàm tạo).

Một cải tiến đối với phiên bản của Ekin là viết phương thức làm phương pháp mở rộng. Sau khi mô hình đặt tên thông thường (như ToList hoặc ToArray), chúng ta có thể gọi nó là ToObservableCollection:

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

Bây giờ bạn có thể tạo một bộ sưu tập quan sát được chứa các loại vô danh trở về từ một truy vấn LINQ như thế này:

var oc = 
    (from t in visibleTasks 
    where t.IsSomething == true 
    select new { Name = t.TaskName, Whatever = t.Foo } 
).ToObservableCollection(); 
+0

Có cách nào để làm điều đó mà không cần sử dụng Generics? Ý tôi là, với mã nội tuyến và không tạo ra một loại thực. Cái gì đó như ObservableCollection ? – v1n1akabozo

0

Bạn có chắc chắn rằng đối tượng của bạn là một ObservableCollection thực sự? Nếu có, bạn chỉ có thể cast: visibleTasks = (ObservableCollection)filteredResults;

1

Bạn chỉ có thể làm điều này:

visibleTasks = new ObservableCollection<MyTasks>(filteredResults); 
2

Something như thế này sẽ làm công việc sử dụng các tính năng suy luận kiểu:

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

Hãy thử:

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

(filteredResults sẽ chứa danh sách mong muốn của bạn)