2011-11-11 2 views
2

J'ai un ensemble de données avec plusieurs colonnes, et tout ce que je veux faire est de supprimer toutes les colonnes sauf celles que j'ai dans une liste. Ainsi, par exemple, l'ensemble de données contient les colonnes «ColA», «ColB» et «ColC». Ma liste contient 1 élément, la chaîne "ColB". Ce que je veux faire est de supprimer "ColA" et "ColC", ou de ne conserver que "ColB".Suppression d'une colonne de données C# en utilisant LINQ

Est-il possible de retirer ceci avec LINQ, ou même en général? Je ne sais pas comment ma liste de chaînes générée dynamiquement pourrait tuer les colonnes de l'ensemble de données d'origine.

Répondre

1
var columnsFromTable = dt.Columns;// get all your column here 
var columnsFromCollection = new string[] { "ColB" };//column to remove 

Array.ForEach(columnsFromCollection,col=> 
dt.Columns.Remove(col)); 
+0

Je cherche à garder ColB et enlever toutes les autres colonnes. Je ne cherche pas à supprimer ColB. – JesseBuesking

0

Performing projection "classique" nécessite un soutien du compilateur

var res = myList.Select(d => new {d.ColB}); 

(le code ci-dessus crée une classe anonyme avec une propriété unique appelée ColB)

Cependant, si la vitesse d'exécution est pas trop importante Pour vous, il est possible d'utiliser ExpandoObject au lieu d'une classe générée par le compilateur, comme ceci:

var columnList = new[] {"ColB"}; 
var res = myList.Select(d => Project(d, columnList)); 
... 
static ExpandoObject Project(MyDataObject d, string[] columns) { 
    var res = new ExpandoObject(); 
    // Using reflection here is a much better solution 
    if (Array.IndexOf(columns, "ColA") >= 0) res.ColA = d.ColA; 
    if (Array.IndexOf(columns, "ColB") >= 0) res.ColB = d.ColB; 
    if (Array.IndexOf(columns, "ColC") >= 0) res.ColC = d.ColC; 
    return res; 
} 
Questions connexes