Obtenha todos os nomes de coluna de um DataTable em uma matriz de string usando (LINQ / Predicate)

107

Sei que podemos fazer isso facilmente por meio de um loop simples, mas quero prosseguir neste LINQ / Predicado?

string[] columnNames = dt.Columns.?

or

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

Respostas:

220

Experimente isto (sintaxe do método LINQ):

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

ou na sintaxe do LINQ Query:

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

Casté obrigatório, porque Columns é do tipo DataColumnCollection que é a IEnumerable, não IEnumerable<DataColumn>. As outras partes devem ser óbvias.

Daniel Hilgarth
fonte
eu sou um novato em linq / lamda ex. Este parece ser bom. mais uma pergunta, como posso colocar a condição (onde dc.ColumnName! = "ABC") na expressão 1 lamda. no linq posso usar onde.
Lalit
Assim: string[] columnNames = dt.Columns.Cast<DataColumn>().Where(x => x.ColumnName != "ABC").Select(x => x.ColumnName).ToArray();
Daniel Hilgarth
1
@Tizz: Por favor, poste como uma nova pergunta e inclua detalhes do seu código. Mas essencialmente: Um DataGrid não é o mesmo que um DataTable.
Daniel Hilgarth
3
@FLICKER: Ainda é necessário pensar um pouco como desenvolvedor. Você tem um cérebro. Use-o.
Daniel Hilgarth
1
Ah bem. Basta olhar para os votos. Obviamente, o problema é com você, não com o código. Vá
pescar
17

Usar

var arrayNames = (from DataColumn x in dt.Columns
                  select x.ColumnName).ToArray();
Sem Vanmeenen
fonte
1
Do meu lado, isso gera duas exceções: não é possível converter de DataColumnCollection para EnumerableRowCollection e DataColumnCollection não contém uma definição para Cast.
4
@Jon Acho que você esqueceu de adicionar 'using System.Linq;' aos seus usos. Acabei de testar meu código e recebo as exceções que você menciona ao 'using System.Linq;' não está lá.
Sem Vanmeenen
Doh! Você está certo; engraçado, essa usingafirmação é adicionada automaticamente com tanta frequência que nunca me ocorreu verificar.
4

Eu sugiro usar esse método de extensão:

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

E portanto:

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

Você também pode implementar mais um método de extensão para a DataTableclasse para reduzir o código:

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

E use-o da seguinte maneira:

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