2012-02-02 20 views
5

Z jakiegoś powodu nie mogę zmienić zapytania, więc muszę to zrobić w języku C#.Usuwanie właściwości/kolumny z ogólnej listy

Mam klasy:

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

Dane jestem coraz pobierana jest na tej liście. Teraz chcę usunąć te właściwości z listy o wartościach null. Może brzmi to szalenie, ale dobrze to czytasz. Pomyślałem o stworzeniu kolejnej listy z tylko wybranymi właściwościami, ale każda z powyższych właściwości może być null. Muszę więc opracować mechanizm filtrowania mojej listy na podstawie tego.

Aby uzyskać większą przejrzystość, rozważ następujący przykład.

List<myClass> lstClass = some data source. 

Po uzyskaniu danych z listy rodzajowe (lstClass) wygląda this.Consider zestaw wyników w tabeli:

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

mogę zrobić jakiś sposób moja lista wygląda następująco po usunięciu właściwość sdate. Tak więc nowa lista, którą chcę utworzyć, powinna mieć tylko trzy właściwości.

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

Wszelkie pomysły? Czy mogę to zrobić, używając Linq?

PS: Nie ma to nic wspólnego z prezentacją. Nie mam siatki, w której nie jestem w stanie ukryć kolumn, które nie są tym, czego szukam.

+1

Twoje pytanie jest bardzo niejasne - nie jest wcale jasne, o jakiej liście mówisz jako o wyniku. Pomogłoby to również, gdyby Twój kod C# był ważny i aby był zgodny z konwencjami nazewnictwa .NET. –

+1

Z pewnością ma to więcej wspólnego z wyświetlaniem danych, w przeciwieństwie do posiadanych danych? –

+0

Będę edytować post, w odniesieniu do konwencji nazewnictwa, przygotowałem próbny przykład do odzwierciedlenia scenariusza. – ankur

Odpowiedz

15

Zakładając, że mamy rodzajowe listę instancji myClass, można utworzyć typ anonimowy tylko potrzebnych właściwościach:

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 Anonimowe typy do ratowania. –

+2

@ M4N, ale nie wiem, która kolumna będzie pusta, więc nie mogę tego zrobić. czy możesz podać przykład, w którym najpierw określasz fragment nazwy kolumny, która musi zostać przekazana w anonimowej klasie. – ankur

0

Nie jestem pewien, należy rozwiązać problem w danych, ale raczej jest to problem z prezentacją. W której kontrolce chcesz go wyświetlić? Powiedzmy, że wyświetlasz go w DataGrid z AutoGenerateColumns = True, następnie możesz 1) pętli na kolumnach/właściwościach 2) dla każdej kolumny/właściwości zobacz, czy wszystkie wartości właściwości dla wszystkich wierszy są zerowe, a jeśli tak, ustaw widoczność kolumny jako Zwiniętą. Jeśli generujesz kolumny samodzielnie, jest to jeszcze prostsze: dodawaj kolumny tylko wtedy, gdy zawartość nie ma wartości null dla wszystkich wierszy.
Jeśli zawartość bazy danych jest dynamiczna, można powiązać widoczność każdego wiersza z właściwością, która wskazywałaby, że wszystkie wiersze mają wartość zerową lub nie dla tej właściwości. W zależności od tego, jaki rodzaj kodu ma być generowany, kod może być bardzo różny, aw przypadku, gdy chcemy mieć rozwiązanie ogólne, użycie Reflection do pobierania/pobierania/ustawiania właściwości może być przydatne.

+0

nie, tak nie jest. – ankur

+0

Twoja umiejętność słuchania porad innych ludzi, aby znaleźć rozwiązanie, jest imponująca. – GameAlchemist