Holen Sie sich alle Spaltennamen einer DataTable mit (LINQ / Predicate) in ein String-Array.

107

Ich weiß, dass wir dies leicht durch eine einfache Schleife tun können, aber ich möchte dieses LINQ / Prädikat fortsetzen?

string[] columnNames = dt.Columns.?

or

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

Antworten:

220

Versuchen Sie Folgendes (LINQ-Methodensyntax):

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

oder in der LINQ Query-Syntax:

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

Castist erforderlich, da Columns vom Typ DataColumnCollection ist IEnumerable, was a ist , nicht IEnumerable<DataColumn>. Die anderen Teile sollten offensichtlich sein.

Daniel Hilgarth
quelle
Ich bin ein Neuling in Linq / Lamda Ex. Das sieht gut aus. Noch eine Frage: Wie kann ich eine Bedingung (wobei dc.ColumnName! = "ABC") in einen Lamda-Ausdruck einfügen? in linq kann ich wo verwenden.
Lalit
Einfach so: string[] columnNames = dt.Columns.Cast<DataColumn>().Where(x => x.ColumnName != "ABC").Select(x => x.ColumnName).ToArray();
Daniel Hilgarth
1
@Tizz: Bitte poste es als neue Frage und gib Details zu deinem Code an. Aber im Wesentlichen: Ein DataGrid ist nicht dasselbe wie eine DataTable.
Daniel Hilgarth
3
@FLICKER: Als Entwickler sind noch einige Überlegungen erforderlich. Du hast ein Gehirn. Benutze es.
Daniel Hilgarth
1
Ah, gut. Schau dir nur die Stimmen an. Offensichtlich liegt das Problem bei Ihnen, nicht beim Code. Gehen Sie woanders trollen
Daniel Hilgarth
17

Verwenden

var arrayNames = (from DataColumn x in dt.Columns
                  select x.ColumnName).ToArray();
Sem Vanmeenen
quelle
1
Meiner Meinung nach wirft dies zwei Ausnahmen auf: Kann nicht von DataColumnCollection in EnumerableRowCollection konvertiert werden, und DataColumnCollection enthält keine Definition für Cast.
4
@ Jon Ich denke, Sie haben nicht vergessen, 'using System.Linq;' zu Ihren Verwendungen. Ich habe gerade meinen Code getestet und erhalte die Ausnahmen, die Sie bei der Verwendung von System.Linq erwähnen. ist nicht da
Sem Vanmeenen
Doh! Sie sind ganz richtig; lustig, diese usingAussage wird automatisch so oft hinzugefügt, dass es mir nie in den Sinn gekommen ist, danach zu suchen.
4

Ich würde vorschlagen, eine solche Erweiterungsmethode zu verwenden:

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

Und deshalb:

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

Sie können auch eine weitere Erweiterungsmethode für die DataTableKlasse implementieren , um den Code zu reduzieren:

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

Und benutze es wie folgt:

string[] columnNames = dataTable.GetColumns().Select(column => column.Name).ToArray();
Deilan
quelle
0
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]));
    }
}
user3233312
quelle