Come selezionare righe distinte in un datatable e archiviare in un array


169

Ho un oggetto set di dati. objds contiene una tabella denominata Table1. Table1 contiene la colonna denominata ProcessName. Questo ProcessName contiene nomi ripetuti, quindi voglio selezionare solo nomi distinti. È possibile.

  intUniqId[i] = (objds.Tables[0].Rows[i]["ProcessName"].ToString());

Pubblica il codice di esempio, da un commento che hai fatto sotto, sembra che la risposta dipenda dai dettagli della query con cui stai lavorando.
Matthew Martedì

Risposte:


360
DataView view = new DataView(table);
DataTable distinctValues = view.ToTable(true, "Column1", "Column2" ...);


se ho 2 colonne "mo" e "name" ho bisogno di ottenere il "mo" distinto ma non il "nome" distinto, ma devo mantenere la colonna "name" nel mio datatable cosa devo fare?
Utente 7291

1
@JocelyneElKhoury, non ha davvero senso ... quale valore di "nome" manterrai allora?
Thomas Levesque,

@ThomasLevesque non importa quale ... diciamo che devo mantenere il primo valore del nome
User7291

17
OK, allora devi raggruppare, non distinto. Potresti farlo con Linq a DataSet:table.AsEnumerable().GroupBy(row => row.Field<int>("mo")).Select(group => group.First()).CopyToDataTable()
Thomas Levesque il

148

La seguente riga di codice eviterà le righe duplicate di un DataTable:

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

Dove:

  • il primo parametro in ToTable()è un valore booleano che indica se si desidera o meno righe distinte.

  • secondo parametro in ToTable()è il nome della colonna in base al quale dobbiamo selezionare righe distinte. Solo queste colonne saranno nel datatable restituito.

Lo stesso può essere fatto da un DataSet, accedendo a uno specifico DataTable:

dataSet.Tables["Employee"].DefaultView.ToTable(true, "employeeid");

5
mi piace di più questa risposta, in quanto indica la DefaultViewproprietà di a DataTable.
Ian Boyd,

Cosa succede se devo distinguermi in base a due colonne?
LCJ

1
@Lijo, il ToTable(boolean, params string[] columnNames)metodo consente di specificare più colonne.
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();

30

Con 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); }


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();

@Adi Lester: forse selezionare new {col1 = dRow ["col1"], col2 = dRow ["col2"], ...}) .Distinct (); è più corretto?
Urik

Quando hai solo un Elenco <DataRow> puoi farlo: var test = (da DataRow dRow in vm.LiveAssets seleziona dRow ["manname"]). Distinct ();
pat capozzi,

La prima linea funziona. Il secondo, come sottolinea Urik, non funziona, ma anche Urik non funziona in quanto Distinct () non troverà uguaglianza quando si fa il confronto di oggetti su tipi anonimi.
Alan Baljeu,

9

Per migliorare la risposta sopra: la funzione ToTable su dataview ha un flag "distinto".

//This will filter all records to be distinct
dt = dt.DefaultView.ToTable(true);

1
Questo non sembra funzionare. C'è solo un sovraccarico con un parametro booleano distinto in esso e richiede l'array di parametri. Penso che questo restituirà solo una tabella chiamata "True" senza alcun DISTINCT applicato.
proudgeekdad,

2
+1 Questo effettivamente funziona (almeno in .NET 4.5). Se si specifica il valore booleano "True" come unico parametro, esegue un DISTINCT su tutte le colonne in DataView.
SetFreeByTruth,

4

A seguito di lavori. Ho funzionato per me con .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);

3

Mi è appena capitato di trovare questo: http://support.microsoft.com/default.aspx?scid=kb;en-us;326176#1

Alla ricerca di qualcosa di simile, solo, in particolare per .net 2.0

Immagino che l'OP cercasse distinti durante l'utilizzo di DataTable.Select (). (Select () non supporta distinti)

Quindi ecco il codice dal link sopra:

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
    }
}

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;
}

2

Sintassi:-

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

EX:-

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

2

La soluzione più semplice è utilizzare LINQ e quindi trasformare il risultato in una DataTable

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

Questo è valido solo per asp.net 4.0 ^ Framework e necessita del riferimento a System.Data.DataSetExtensions come ha sottolineato Ivan Ferrer Villa


1
forse ha bisogno del riferimento aSystem.Data.DataSetExtensions
Ivan Ferrer Villa,

1
var ValuetoReturn = (from Rows in YourDataTable.AsEnumerable()
select Rows["ColumnName"]).Distinct().ToList();

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 };

Filtra la tabella dei dati con eecode e taxyear considerati univoci


0

è facile

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

e dt2 datatable contengono column1, Column2..ColumnNth dati univoci.


0
objds.Table1.Select(r => r.ProcessName).AsEnumerable().Distinct();

Ciao @ GálGyula, benvenuto in Stack Overflow! Qui ci preoccupiamo delle risposte con buone spiegazioni, non solo del codice. Pubblica una risposta solo se risolve davvero la domanda e puoi spiegare come. Per migliorare le tue risposte future, dai un'occhiata alla guida come faccio a scrivere una buona risposta .
Erick Petrucelli,

-1

sthing come?

SELEZIONA DISTINCT .... DALLA tabella DOVE condizione

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

nota: domanda a casa? e dio benedica google ..

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


3
a chi mi ha votato in negativo: S ,, ovviamente la domanda è stata modificata dopo la mia risposta ?? (risposta 10:15, domanda modificata alle 12:15) vabbè .. grazie per la tua ignoranza :)
Madi D.

2
OP chiede come selezionare righe distinte in un ambiente C # ado.net, non in un database reale.
aggaton

-1
DataTable dtbs = new DataTable(); 
DataView dvbs = new DataView(dt); 
dvbs.RowFilter = "ColumnName='Filtervalue'"; 
dtbs = dvbs.ToTable();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.