2010-02-26 24 views
6

Tengo una declaración LINQ que devuelve un tipo anónimo. Necesito que este tipo sea un ObservableCollection en mi aplicación Silverlight. Sin embargo, lo más cercano que puedo obtener es aC# - convertir el tipo anónimo en observablecollection

Listar myObjects;

¿Alguien me puede decir cómo hacerlo?

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 

¿Cómo puedo pasar de un tipo anónimo a una colección observable?

Gracias

Respuesta

6

Como Ekin sugiere, puede escribir un método genérico que convierta cualquier IEnumerable<T> en ObservableCollection<T>. Esto tiene una ventaja significativa sobre la creación de una nueva instancia de ObservableCollection usando constructor: el compilador de C# puede inferir automáticamente el parámetro de tipo genérico cuando llama a un método, por lo que no necesita escribir el tipo de los elementos. Esto le permite crear una colección de tipos anónimos, que de otro modo no sería posible (por ejemplo, al usar un constructor).

Una mejora sobre la versión de Ekin es escribir el método como método de extensión. Siguiendo el patrón de nomenclatura habitual (como ToList o ToArray), podemos decir que es ToObservableCollection:

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

Ahora puede crear una colección observable que contiene los tipos anónimos regresar de una consulta LINQ como esto:

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

¿Hay alguna manera de hacerlo sin usar genéricos? Quiero decir, con código en línea y sin crear un tipo real. Algo como ObservableCollection ? – v1n1akabozo

0

¿Estás seguro de que su objeto es una ObservableCollection verdad? Si es así, sólo puede reparto: visibleTasks = (ObservableCollection)filteredResults;

1

Usted sólo debe ser capaz de hacer esto:

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

Algo como esto haría el trabajo usando las características de tipo de inferencia:

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

Probar:

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

(filteredResults contendrán la lista deseada)

Cuestiones relacionadas