Cómo seleccionar filas distintas en una tabla de datos y almacenarlas en una matriz


169

Tengo un conjunto de datos objds. objds contiene una tabla llamada Table1. La Tabla1 contiene una columna llamada ProcessName. Este ProcessName contiene nombres repetidos, por lo que quiero seleccionar solo nombres distintos. Esto es posible.

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

Publique el código de muestra, de un comentario que hizo a continuación, parece que la respuesta depende de los detalles de la consulta con la que está trabajando.
MatthewMartin

Respuestas:


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


si tengo 2 columnas "mo" y "nombre", necesito obtener el "mo" distinto pero no el "nombre" distinto, pero necesito mantener la columna "nombre" en mi tabla de datos, ¿qué debo hacer?
Usuario7291

1
@JocelyneElKhoury, eso realmente no tiene sentido ... ¿qué valor de "nombre" mantendrás entonces?
Thomas Levesque

@ThomasLevesque no importa cuál ... digamos que necesito mantener el primer valor del nombre
User7291

17
OK, entonces necesitas agrupación, no distinta. Puede hacerlo con Linq to DataSet:table.AsEnumerable().GroupBy(row => row.Field<int>("mo")).Select(group => group.First()).CopyToDataTable()
Thomas Levesque

148

Seguir una sola línea de código evitará las filas duplicadas de a DataTable:

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

Dónde:

  • El primer parámetro en ToTable()es un booleano que indica si desea filas distintas o no.

  • El segundo parámetro en el ToTable()es el nombre de la columna en función del cual tenemos que seleccionar filas distintas. Solo estas columnas estarán en la tabla de datos devuelta.

Lo mismo se puede hacer desde un DataSet, accediendo a un específico DataTable:

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

55
Me gusta más esta respuesta, ya que apunta a la DefaultViewpropiedad de a DataTable.
Ian Boyd

¿Qué sucede si necesito distinguirme en base a dos columnas?
LCJ

1
@Lijo, el ToTable(boolean, params string[] columnNames)método permite especificar múltiples columnas.
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: tal vez seleccione nuevo {col1 = dRow ["col1"], col2 = dRow ["col2"], ...}) .Distinct (); es mas correcto?
Urik

Cuando solo tiene una Lista <DataRow> puede hacer esto: var test = (desde DataRow dRow en vm.LiveAssets seleccione dRow ["manname"]). Distinct ();
pat capozzi

La primera línea funciona. El segundo, como señala Urik, no lo hace, pero Urik tampoco funciona, ya que Distinct () no encontrará la igualdad al comparar objetos en tipos anónimos.
Alan Baljeu

9

Para mejorar la respuesta anterior: La función ToTable en dataview tiene un indicador "distinto".

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

1
Esto no parece funcionar. Solo hay una sobrecarga con un parámetro booleano distinto y requiere la matriz de parámetros. Creo que esto solo devolverá una tabla llamada "Verdadero" sin ningún DISTINCT aplicado.
proudgeekdad

2
+1 Esto realmente funciona (al menos en .NET 4.5). Si especifica el valor booleano "True" como el único parámetro, realiza un DISTINCT en todas las columnas en el DataView.
SetFreeByTruth

4

Siguiendo trabajos. Lo tengo funcionando para mí 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

Acabo de encontrar esto: http://support.microsoft.com/default.aspx?scid=kb;en-us;326176#1

Mientras buscas algo similar, solo, específicamente para .net 2.0

Supongo que el OP estaba buscando distinto mientras usaba DataTable.Select (). (Seleccionar () no admite distintos)

Así que aquí está el código del enlace anterior:

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

Sintaxis:-

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

EX:-

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

2

La solución más simple es usar LINQ y luego transformar el resultado en un DataTable

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

Esto es válido solo para asp.net 4.0 ^ Framework y necesita la referencia a System.Data.DataSetExtensions como señaló Ivan Ferrer Villa


1
quizás necesita la referencia 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 tabla de datos con eecode y taxyear considerados en conjunto como únicos


0

es fácil

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

y la tabla de datos dt2 contienen datos únicos column1, Column2..ColumnNth.


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

Hola @ GálGyula, ¡bienvenido a Stack Overflow! Aquí nos interesan las respuestas con buenas explicaciones, no solo el código. Solo publique una respuesta si realmente resuelve la pregunta y puede explicar cómo. Para mejorar sus futuras respuestas, eche un vistazo a la guía sobre cómo escribir una buena respuesta .
Erick Petrucelli

-1

como algo?

SELECCIONE DISTINTO .... DE la tabla DONDE condición

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

nota: ¿Pregunta de tarea? y que dios bendiga a google ..

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


3
a quien me rechazó: S ,, obviamente, ¿la pregunta fue modificada después de mi respuesta? (respuesta 10:15, pregunta editada el 12:15) oh bueno ... gracias por tu ignorancia :)
Madi D.

2
OP pregunta cómo seleccionar filas distintas en un entorno C # ado.net, no en una base de datos real.
aggaton

-1
DataTable dtbs = new DataTable(); 
DataView dvbs = new DataView(dt); 
dvbs.RowFilter = "ColumnName='Filtervalue'"; 
dtbs = dvbs.ToTable();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.