2010-02-26 28 views
6

Anonim bir yazı tipini döndüren bir LINQ deyim var. Silverlight uygulamamda bir ObservableCollection olması için bu türü almam gerekiyor. Bununla birlikte, en yakın değeriC# - anonim türünü observablecollection konumuna dönüştürün

List myObjects;

Birisi bana bunu nasıl yapacağımı söyleyebilir mi?

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 

Anonim bir türden gözlemlenebilir bir koleksiyona nasıl gidebilirim?

ederiz size

cevap

6

önerirsiniz, herhangi bir IEnumerable<T>'u ObservableCollection<T>'a dönüştüren genel bir yöntem yazabilirsiniz. Bu, kurucuyu kullanarak ObservableCollection'un yeni bir örneğini oluşturmanın önemli bir avantajına sahiptir - C# derleyicisi, bir yöntemi çağırırken genel tür parametresini otomatik olarak bulabilir, bu nedenle öğelerin türünü yazmanız gerekmez. Bu, anonim türlerin bir koleksiyonunu oluşturmanıza olanak tanır, ki bu da mümkün olmayacaktır (örneğin bir kurucu kullanılırken).

Ekin'in versiyonuna göre bir gelişme, yöntemi bir uzatma yöntemi olarak yazmaktır. Her zamanki adlandırma deseni takiben (örneğin ToList veya ToArray gibi), bunu ToObservableCollection çağırabilirsiniz:

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

Jenerik kullanmadan bunu yapmanın bir yolu var mı? Satır içi kodla ve gerçek bir tür oluşturmadan demek istiyorum. ObservableCollection gibi bir şey? – v1n1akabozo

0

Eğer emin senin nesnenin gerçekten bir ObservableCollection olduğunu musunuz? evet, sadece yayın yapabilirsiniz: visibleTasks = (ObservableCollection)filteredResults;

1

Sadece bunu yapmak mümkün olmalıdır:

tür kesmesi özelliklerini kullanarak iş yapacağını böyle
visibleTasks = new ObservableCollection<MyTasks>(filteredResults); 
2

şey: Ekin gibi

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
:

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

Şimdi anonim türleri böyle bir LINQ sorgudan döndürülen içeren bir gözlemlenebilir koleksiyonu oluşturabilirsiniz

Dene:

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

(filteredResults istediğiniz listeyi içerecektir)