Como selecionar linhas distintas em uma tabela de dados e armazenar em uma matriz

169

Eu tenho um objds do conjunto de dados. objds contém uma tabela chamada Table1. Tabela1 contém a coluna denominada ProcessName. Este ProcessName contém nomes repetidos. Portanto, desejo selecionar apenas nomes distintos. Isso é possível.

  intUniqId[i] = (objds.Tables[0].Rows[i]["ProcessName"].ToString());
Ahmed Atia
fonte
Poste o código de exemplo, de um comentário que você fez abaixo, parece que a resposta depende dos detalhes específicos da consulta com a qual você está trabalhando.
29416 MatthewMartin

Respostas:

360
DataView view = new DataView(table);
DataTable distinctValues = view.ToTable(true, "Column1", "Column2" ...);
Thomas Levesque
fonte
se eu tiver 2 colunas "mo" e "nome", preciso obter o "mo" distinto, mas não o "nome" distinto, mas preciso manter a coluna "nome" na minha tabela de dados, o que devo fazer?
usar o seguinte comando
1
@JocelyneElKhoury, isso realmente não faz sentido ... que valor de "nome" você manterá?
Thomas Levesque
@ThomasLevesque não importa qual deles ... digamos que eu preciso para manter o primeiro valor do nome
User7291
17
OK, então você precisa de agrupamento, não distinto. Você poderia fazê-lo com o Linq to DataSet:table.AsEnumerable().GroupBy(row => row.Field<int>("mo")).Select(group => group.First()).CopyToDataTable()
Thomas Levesque
148

A seguinte linha de código evitará as linhas duplicadas de a DataTable:

dataTable.DefaultView.ToTable(true, "employeeid");

Onde:

  • O primeiro parâmetro in ToTable()é um booleano que indica se você deseja linhas distintas ou não.

  • O segundo parâmetro no ToTable()é o nome da coluna com base na qual temos que selecionar linhas distintas. Somente essas colunas estarão na tabela de dados retornada.

O mesmo pode ser feito a partir de a DataSet, acessando um específico DataTable:

dataSet.Tables["Employee"].DefaultView.ToTable(true, "employeeid");
Rahul
fonte
5
Eu gosto mais desta resposta, pois aponta para a DefaultViewpropriedade de a DataTable.
22612 Ian
E se eu precisar diferenciar com base em duas colunas?
LCJ
1
@Lijo, o ToTable(boolean, params string[] columnNames)método permite que várias colunas sejam especificadas.
Kristen Hammack
57
DataTable dt = new DataTable();
dt.Columns.Add("IntValue", typeof(int));
dt.Columns.Add("StringValue", typeof(string));
dt.Rows.Add(1, "1");
dt.Rows.Add(1, "1");
dt.Rows.Add(1, "1");
dt.Rows.Add(2, "2");
dt.Rows.Add(2, "2");

var x = (from r in dt.AsEnumerable()
        select r["IntValue"]).Distinct().ToList();
Martin Moser
fonte
30

Com LINQ (.NET 3.5, C # 3)

var distinctNames = ( from row in DataTable.AsEnumerable()
 select row.Field<string>("Name")).Distinct();

 foreach (var name in distinctNames ) { Console.WriteLine(name); }
Zain Ali
fonte
13
var distinctRows = (from DataRow dRow in dtInventory.Rows
                                select dRow["column_name"] ).Distinct();

var distinctRows = (from DataRow dRow in dtInventory.Rows
                                select dRow["col1"], dRow["col2"].. ).Distinct();
ces2601
fonte
@Adi Lester: talvez selecione new {col1 = dRow ["col1"], col2 = dRow ["col2"], ...}) .Distinct (); está mais correto?
Urik
Quando você tem apenas uma lista <DataRow>, pode fazer isso: var test = (do DataRow dRow na vm.LiveAssets selecione dRow ["manname"]). Distinct ();
Pat Capozzi
A primeira linha funciona. O segundo, como Urik aponta, não, mas o Urik também não funciona, pois Distinct () não encontrará igualdade ao fazer comparação de objetos em tipos anônimos.
Alan Baljeu 13/10/1918
9

Para melhorar a resposta acima: A função ToTable na vista de dados possui um sinalizador "distinto".

//This will filter all records to be distinct
dt = dt.DefaultView.ToTable(true);
Ravedave
fonte
1
Isso não parece funcionar. Há apenas uma sobrecarga com um parâmetro booleano distinto e isso requer a matriz de parâmetros. Eu acho que isso apenas retornará uma tabela chamada "True" sem nenhum DISTINCT aplicado.
proudgeekdad 15/10/10
2
+1 Isso realmente funciona (pelo menos no .NET 4.5). Se você especificar o valor booleano "True" como o único parâmetro, ele executará um DISTINCT em todas as colunas no DataView.
SetFreeByTruth
4

Trabalhos seguintes. Estou trabalhando para mim com o .NET 3.5 SP1

// Create the list of columns
String[] szColumns = new String[data.Columns.Count];
for (int index = 0; index < data.Columns.Count; index++)
{
    szColumns[index] = data.Columns[index].ColumnName;
}

// Get the distinct records
data = data.DefaultView.ToTable(true, szColumns);
Vijay Balani
fonte
3

Por acaso encontrei o seguinte: http://support.microsoft.com/default.aspx?scid=kb;en-us;326176#1

Ao procurar algo semelhante, apenas, especificamente para .net 2.0

Estou assumindo que o OP estava procurando distinto ao usar DataTable.Select (). (Select () não suporta distintos)

Então, aqui está o código do link acima:

class DataTableHelper 
{
    public DataTable SelectDistinct(string TableName, DataTable SourceTable, string FieldName)
    {   
        DataTable dt = new DataTable(TableName);
        dt.Columns.Add(FieldName, SourceTable.Columns[FieldName].DataType);

        object LastValue = null; 
        foreach (DataRow dr in SourceTable.Select("", FieldName))
        {
            if (  LastValue == null || !(ColumnEqual(LastValue, dr[FieldName])) ) 
            {
                LastValue = dr[FieldName]; 
                dt.Rows.Add(new object[]{LastValue});
            }
        }

        return dt;
    }

    private bool ColumnEqual(object A, object B)
    {

        // Compares two values to see if they are equal. Also compares DBNULL.Value.
        // Note: If your DataTable contains object fields, then you must extend this
        // function to handle them in a meaningful way if you intend to group on them.

        if ( A == DBNull.Value && B == DBNull.Value ) //  both are DBNull.Value
            return true; 
        if ( A == DBNull.Value || B == DBNull.Value ) //  only one is DBNull.Value
            return false; 
        return ( A.Equals(B) );  // value type standard comparison
    }
}
gideon
fonte
2
string[] TobeDistinct = {"Name","City","State"};
DataTable dtDistinct = GetDistinctRecords(DTwithDuplicate, TobeDistinct);

//Following function will return Distinct records for Name, City and State column.
public static DataTable GetDistinctRecords(DataTable dt, string[] Columns)
{
    DataTable dtUniqRecords = new DataTable();
    dtUniqRecords = dt.DefaultView.ToTable(true, Columns);
    return dtUniqRecords;
}
Tanmay Nehete
fonte
2

Sintaxe:-

DataTable dt = ds.Tables[0].DefaultView.ToTable(true, "ColumnName");

EX:-

DataTable uniqueCols = dsUDFlable.Tables[0].DefaultView.ToTable(true, "BorrowerLabelName");
user3639409
fonte
2

A solução mais simples é usar o LINQ e depois transformar o resultado em um DataTable

    //data is a DataTable that you want to change
    DataTable result = data.AsEnumerable().Distinct().CopyToDataTable < DataRow > ();

Isso é válido apenas para o asp.net 4.0 ^ Framework e precisa da referência a System.Data.DataSetExtensions como Ivan Ferrer Villa apontou

Davide Castronovo
fonte
1
talvez precise da referência aSystem.Data.DataSetExtensions
Ivan Ferrer Villa
1
var ValuetoReturn = (from Rows in YourDataTable.AsEnumerable()
select Rows["ColumnName"]).Distinct().ToList();
Dylan
fonte
1
DataTable dt = new DataTable("EMPLOYEE_LIST");

DataColumn eeCode = dt.Columns.Add("EMPLOYEE_CODE", typeof(String));
DataColumn taxYear = dt.Columns.Add("TAX_YEAR", typeof(String));
DataColumn intData = dt.Columns.Add("INT_DATA", typeof(int));
DataColumn textData = dt.Columns.Add("TEXT_DATA", typeof(String));

dt.PrimaryKey = new DataColumn[] { eeCode, taxYear };

Ele filtra a tabela de dados com código eletrônico e taxyear considerados combinados como exclusivos

Viswa Teja Kuncham
fonte
0

Isso é fácil

    DataView view = new DataView(dt);
DataTable dt2 = view.ToTable(true, "Column1", "Column2","Column3", ...,"ColumnNth");

e a tabela de dados dt2 contém dados exclusivos da coluna1, coluna2 e colunaNº.

Manish Singh
fonte
0
objds.Table1.Select(r => r.ProcessName).AsEnumerable().Distinct();
Gál Gyula
fonte
Olá @ GálGyula, bem-vindo ao Stack Overflow! Aqui nos preocupamos com respostas com boas explicações, não apenas com código. Poste apenas uma resposta se ela realmente resolver a pergunta e você puder explicar como. Para melhorar suas respostas futuras, consulte o guia, como escrevo uma boa resposta .
Erick Petrucelli
-1

sthing como?

SELECT DISTINCT .... FROM tabela WHERE condição

http://www.felixgers.de/teaching/sql/sql_distinct.html

nota: pergunta de lição de casa? e deus abençoe o google ..

http://www.google.com/search?hl=pt_BR&rlz=1C1GGLS_enJO330JO333&q=c%23+selecting+distinct+values+from+table&aq=f&oq=&aqi=

Madi D.
fonte
3
para quem me rebaixou: S ,, obviamente a pergunta foi modificada após a minha resposta ?? (resposta 10:15, pergunta editado em 12:15) oh bem .. thx for ur ignorância :)
Madi D.
2
O OP pergunta como selecionar linhas distintas em um ambiente C # ado.net, não em um banco de dados real.
precisa saber é
-1
DataTable dtbs = new DataTable(); 
DataView dvbs = new DataView(dt); 
dvbs.RowFilter = "ColumnName='Filtervalue'"; 
dtbs = dvbs.ToTable();
Packiyaraj Shanmugam
fonte