2012-11-22 17 views
6

Desidero selezionare le colonne dinamicamente da List come segue. Quindi quale potrebbe essere il modo migliore?Come selezionare la colonna dinamica dall'elenco

//a objects list 
List<DashBoard> dashboardlist = (List<DashBoard>)objList; 
string strColumns = "RecDate,ModifiedDate"; 
objList = (from obj in dashboardlist select new { strColumns }).ToList(); 

///////////// Ok, Basta dimenticare Object List dire che ho tabella di database che hanno numero di ID di colonna, nome, età, sesso, ecc ..quindi ho avere columnList da visualizzare e columnList cambia in base alle condizioni. COSÌ ho persone della lista; ed elenca columnTemplate; quindi ora voglio selezionare la colonna in base al modello.

+4

Come pensate di usare 'objList'? Spero ti renderai conto che non sarà così semplice accedere alle proprietà come quando definisci staticamente le colonne ('seleziona new {obj.RecDate, obj.ModifiedDate}') che stai selezionando in modo che C# possa creare un tipo anonimo per te . Potrebbe essere più semplice continuare a utilizzare gli oggetti 'DashBoard' completi e leggere solo le proprietà specificate dalle stringhe, se necessario. –

+0

Qual è la situazione che ha sollevato questa domanda? Sarei propenso a concordare con Tim S - stick con l'oggetto Dashboard –

+0

C'è qualche ragione per cui è necessario restituire un oggetto anonimo o cosa è necessario restituire un 'Elenco ' con proprietà differenti inizializzate? –

risposta

6

Grazie per avermi fornito le idee alla mia domanda. Trascorsa un paio d'ore in Google ho trovato solution.

public void Test() { 
    var data = new[] { 
     new TestData { X = 1, Y = 2, Z = 3 } 
    , new TestData { X = 2, Y = 4, Z = 6 } 
    }; 
    var strColumns = "X,Z".Split(','); 
    foreach (var item in data.Select(a => Projection(a, strColumns))) { 
     Console.WriteLine("{0} {1}", item.X, item.Z); 
    } 
} 
private static dynamic Projection(object a, IEnumerable<string> props) { 
    if (a == null) { 
     return null; 
    } 
    IDictionary<string,object> res = new ExpandoObject(); 
    var type = a.GetType(); 
    foreach (var pair in props.Select(n => new { 
     Name = n 
    , Property = type.GetProperty(n)})) { 
     res[pair.Name] = pair.Property.GetValue(a, new object[0]); 
    } 
    return res; 
} 
class TestData { 
    public int X { get; set; } 
    public int Y { get; set; } 
    public int Z { get; set; } 
} 
1

Presumo che l'elenco delle colonne può venire da una risorsa esterna e di cambiamento, propongo:

Con la riflessione si potrebbe produrre un elenco di FieldInfo che corrispondono a ogni colonna, poi un ciclo su ogni punto all'ordine del elenca e ogni FieldInfo e chiama GetValue sull'oggetto dati.

0

Let suppone di avere solo 2 modelli. È possibile creare un metodo per ogni modello, che restituisce solo le colonne necessarie. Qualcosa di simile a questo:

// method for template 1 - returns only 3 columns/properties 
private DashBoard CreateDashBoardXxxxxxx(DashBoard item) 
{ 
    return new DashBoard { 
     Property1 = item.Property1, 
     Property4 = item.Property2, 
     Property3 = item.Property3 
    }; 
} 

// method for template 2 - returns N columns/properties 
private DashBoard CreateDashBoardYyyyyyyy(DashBoard item) 
{ 
    return new DashBoard { 
     Property1 = item.Property1, 
     Property4 = item.Property2, 

     // Other properties 
     // ..... 

     PropertyN = item.PropertyN 
    }; 
} 

È quindi possibile utilizzare gli stessi metodi come questo:

List<DashBoard> dashboardlist = (List<DashBoard>)objList; 

// using template 1 
var list = dashboardlist.Select(CreateDashBoardXxxxxxx); 

// using template 2 
var list2 = dashboardlist.Select(CreateDashBoardYyyyyyyy); 

Hai solo bisogno di fare un po 'di codice per decidere quale modello da utilizzare.

Spero che questo aiuti !!

Problemi correlati