120 votes

Obtenir tous les noms de colonnes d'une table de données dans un tableau de chaînes de caractères en utilisant (LINQ/Predicate)

Je sais que nous pouvons facilement faire cela par une simple boucle, mais je veux poursuivre cette LINQ/Predicate ?

string[] columnNames = dt.Columns.?

or

string[] columnNames = from DataColumn dc in dt.Columns select dc.name;

249voto

Daniel Hilgarth Points 90722

Essayez ceci (syntaxe de la méthode LINQ) :

string[] columnNames = dt.Columns.Cast<DataColumn>()
                                 .Select(x => x.ColumnName)
                                 .ToArray();  

ou dans la syntaxe des requêtes LINQ :

string[] columnNames = (from dc in dt.Columns.Cast<DataColumn>()
                        select dc.ColumnName).ToArray();

Cast est nécessaire, car Columns est de type DataColumnCollection qui est une IEnumerable pas IEnumerable<DataColumn> . Les autres parties devraient être évidentes.

0 votes

Je suis un novice en matière de linq/lamda ex. Cela semble bon. Une autre question : comment puis-je placer la condation (where dc.ColumnName != "ABC") dans une expression lamda ? En linq, je peux utiliser where.

0 votes

Comme ça : string[] columnNames = dt.Columns.Cast<DataColumn>().Where(x => x.ColumnName != "ABC").Select(x => x.ColumnName).ToArray();

0 votes

Je reçois toujours le message "Unable to cast object of type 'System.Windows.Forms.DataGridViewTextBoxColumn' to type 'System.Data.DataColumn'. Que se passe-t-il ?

18voto

Sem Vanmeenen Points 1491

Utilisez

var arrayNames = (from DataColumn x 
                  in dt.Columns.Cast<DataColumn>()
                  select x.ColumnName).ToArray();

1 votes

Pour ma part, j'obtiens deux exceptions : impossible de convertir DataColumnCollection en EnumerableRowCollection et DataColumnCollection ne contient pas de définition pour Cast.

4 votes

@Jon Je pense que vous avez oublié d'ajouter 'using System.Linq;' à vos utilisations. Je viens de tester mon code et j'obtiens les exceptions que vous mentionnez lorsque 'using System.Linq;' n'est pas présent.

0 votes

Doh ! Vous avez tout à fait raison ; drôle, que using est ajoutée automatiquement si souvent que je n'ai jamais pensé à la vérifier.

4voto

Deilan Points 76

Je suggère d'utiliser une telle méthode d'extension :

public static class DataColumnCollectionExtensions
{
    public static IEnumerable<DataColumn> AsEnumerable(this DataColumnCollection source)
    {
        return source.Cast<DataColumn>();
    }
}

Et donc :

string[] columnNames = dataTable.Columns.AsEnumerable().Select(column => column.Name).ToArray();

Vous pouvez également implémenter une méthode d'extension supplémentaire pour DataTable pour réduire le code :

public static class DataTableExtensions
{
    public static IEnumerable<DataColumn> GetColumns(this DataTable source)
    {
        return source.Columns.AsEnumerable();
    }
}

Et utilisez-le comme suit :

string[] columnNames = dataTable.GetColumns().Select(column => column.Name).ToArray();

0voto

user3233312 Points 158
List<String> lsColumns = new List<string>();

if(dt.Rows.Count>0)
{
    var count = dt.Rows[0].Table.Columns.Count;

    for (int i = 0; i < count;i++ )
    {
        lsColumns.Add(Convert.ToString(dt.Rows[0][i]));
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X