2010-02-26 8 views
6

J'ai une instruction LINQ qui retourne un type anonyme. Je dois obtenir ce type pour être une ObservableCollection dans mon application Silverlight. Cependant, le plus proche je peux l'obtenir à unC# - convertir un type anonyme en observablecollection

List myObjects;

Quelqu'un peut-il me dire comment faire?

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 

Comment puis-je passer d'un type anonyme à une collection observable?

Merci

Répondre

6

Comme Ekin suggère, vous pouvez écrire une méthode générique qui transforme tout IEnumerable<T> en ObservableCollection<T>. Cela a un avantage significatif sur la création d'une nouvelle instance de ObservableCollection en utilisant le constructeur - le compilateur C# est capable de déduire le paramètre de type générique automatiquement lors de l'appel d'une méthode, donc vous n'avez pas besoin d'écrire le type des éléments. Cela vous permet de créer une collection de types anonymes, ce qui ne serait pas possible autrement (par exemple lors de l'utilisation d'un constructeur). Une amélioration par rapport à la version d'Ekin consiste à écrire la méthode en tant que méthode d'extension. Suivant le modèle de dénomination habituelle (comme ToList ou ToArray), nous pouvons l'appeler ToObservableCollection:

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

Maintenant, vous pouvez créer une collection observable contenant les types anonymes renvoyés d'une requête LINQ comme ceci:

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

Existe-t-il un moyen de le faire sans utiliser de génériques? Je veux dire, avec le code en ligne et sans créer un vrai type. Quelque chose comme ObservableCollection ? – v1n1akabozo

0

Êtes-vous sûr que votre objet est un ObservableCollection en effet? Si oui, vous pouvez simplement jeté: visibleTasks = (ObservableCollection)filteredResults;

1

Vous devez simplement être en mesure de le faire:

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

Quelque chose comme ça ferait le travail en utilisant les caractéristiques d'inférence de type:

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

Essayez:

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

(filteredResults contiendra votre liste désirée)

Questions connexes