2012-02-02 14 views
5

Per qualche motivo non posso modificare la query, quindi devo farlo in C#.Rimuovere una proprietà/colonna da un elenco generico

Ho una classe:

public class myClass 
{ 
    int id { get; set; } 
    string name { get; set; } 
    DateTime sDate { get; set; } 
    bool status { get; set; } 
} 

I dati che sto ottenendo vengono recuperati in questo elenco. Ora quello che voglio è rimuovere quelle proprietà da un elenco che ha valori null. Potrei sembrare pazzo ma hai letto bene. Ho pensato di creare un altro elenco con solo le proprietà selezionate, ma ognuna delle proprietà sopra può essere null. Quindi devo escogitare un meccanismo per filtrare il mio elenco basato su questo.

Per maggiore chiarezza, considerare il seguente esempio.

List<myClass> lstClass = some data source. 

Dopo aver ottenuto i dati l'elenco generico (lstClass) sembra this.Consider il set di risultati in una tabella:

Id Name Sdate status 
1 a null null 
2 b null null 
3 c null false 

Posso in qualche modo fare la mia lista simile a questa dopo aver rimosso la proprietà sdate. Quindi la nuova lista che voglio creare dovrebbe avere solo tre proprietà.

Id Name status 
1 a null 
2 b null 
3 c false 

Qualche idea? Posso farlo usando Linq?

PS: Questo non ha nulla a che fare con la presentazione. Non ho una griglia in cui non sono in grado di nascondere colonne che non sono quello che sto cercando.

+1

La tua domanda è molto poco chiara - non è affatto ovvio di che tipo di elenco stai parlando come risultato. Sarebbe anche d'aiuto se si rendesse valido il codice C# e si seguisse la convenzione di denominazione .NET. –

+1

Sicuramente questo ha più a che fare con il modo in cui visualizzi i dati dati, a differenza dei dati che hai? –

+0

Modificherò il post, per quanto riguarda la convenzione di denominazione, ho preparato un esempio fittizio per riflettere lo scenario. – ankur

risposta

15

Supponendo di avere un elenco generico di istanze myClass, è possibile creare un tipo anonimo con solo le proprietà necessarie:

List<myClass> list = ...; 
var reducedList = list.Select(e => new {e.id, e.name, e.status}).ToList(); 
// note: call to ToList() is optional 

foreach (var item in reducedList) 
{ 
    Console.WriteLine(item.id + " " + item.name + " " + item.status); 
    //note: item does not have a property "sDate" 
} 
+2

+1 Tipi anonimi da salvare. –

+2

@ M4N ma non so quale colonna sarà vuota, quindi non posso forzare il cavo. puoi fornire un esempio in cui per prima cosa determini il blocco del nome della colonna che deve essere passato nella classe anonima. – ankur

0

Non sono sicuro che si dovrebbe risolvere il problema nei dati, ma piuttosto è un problema di presentazione. In quale controllo si desidera visualizzarlo? Diciamo che lo si visualizza in DataGrid con AutoGenerateColumns = True, quindi è possibile 1) loop su colonne/proprietà 2) per ogni colonna/proprietà vedere se tutti i valori di proprietà per tutte le righe sono nulli e in tal caso impostare la visibilità della colonna su Collapsed. Se generate le colonne da soli, è ancora più semplice: aggiungi solo colonne quando il contenuto non è nullo per tutte le righe.
Se il contenuto del DB è dinamico, è possibile associare la visibilità di ogni riga a una proprietà che indichi se tutte le righe sono nulle o meno per quella proprietà. A seconda di quanto generico vuoi che sia il tuo codice, il codice potrebbe essere molto diverso, e nel caso tu voglia avere una soluzione generica, usare Reflection per recuperare/ottenere/impostare le proprietà potrebbe essere di qualche utilità.

+0

no questo non è il caso. – ankur

+0

la tua capacità di ascoltare il consiglio di altre persone per arrivare a una soluzione è abbastanza impressionante. – GameAlchemist

Problemi correlati