So wählen Sie verschiedene Zeilen in einer Datentabelle aus und speichern sie in einem Array


167

Ich habe einen Datensatz objds. objds enthält eine Tabelle mit dem Namen Table1. Tabelle 1 enthält eine Spalte mit dem Namen ProcessName. Dieser Prozessname enthält wiederholte Namen. Daher möchte ich nur unterschiedliche Namen auswählen. Ist dies möglich?

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

Nach einem Kommentar, den Sie unten abgegeben haben, hängt die Antwort anscheinend von den Besonderheiten der Abfrage ab, mit der Sie arbeiten.
Matthew

Antworten:


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


Wenn ich 2 Spalten "mo" und "name" habe, muss ich das eindeutige "mo", aber nicht den eindeutigen "name" erhalten, aber ich muss die Spalte "name" in meiner Datentabelle behalten. Was soll ich tun?
User7291

1
@JocelyneElKhoury, das macht nicht wirklich Sinn ... welchen Wert von "Name" wirst du dann behalten?
Thomas Levesque

@ ThomasLevesque es spielt keine Rolle, welche ... Nehmen wir an, ich muss den ersten Wert des Namens
behalten

17
OK, dann brauchen Sie eine Gruppierung, nicht eindeutig. Sie könnten es mit Linq zu DataSet tun:table.AsEnumerable().GroupBy(row => row.Field<int>("mo")).Select(group => group.First()).CopyToDataTable()
Thomas Levesque

148

Wenn Sie einer einzelnen Codezeile folgen, werden die doppelten Zeilen von a vermieden DataTable:

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

Wo:

  • Der erste Parameter in ToTable()ist ein Boolescher Wert, der angibt, ob Sie unterschiedliche Zeilen möchten oder nicht.

  • Der zweite Parameter in ToTable()ist der Spaltenname, anhand dessen wir verschiedene Zeilen auswählen müssen. Nur diese Spalten befinden sich in der zurückgegebenen Datentabelle.

Das Gleiche kann von a aus geschehen DataSet, indem Sie auf eine bestimmte Adresse zugreifen DataTable:

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

5
Ich mag diese Antwort am meisten, da sie auf die DefaultViewEigenschaft von a verweist DataTable.
Ian Boyd

Was ist, wenn ich anhand von zwei Spalten unterscheiden muss?
LCJ

1
@Lijo, mit dieser ToTable(boolean, params string[] columnNames)Methode können mehrere Spalten angegeben werden.
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

Mit 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: Wählen Sie möglicherweise new {col1 = dRow ["col1"], col2 = dRow ["col2"], ...}) .Distinct (); ist korrekter?
Urik

Wenn Sie nur eine Liste <DataRow> haben, können Sie dies tun: var test = (Wählen Sie in DataRow dRow in vm.LiveAssets dRow ["manname"] aus). Distinct ();
Pat Capozzi

Die erste Zeile funktioniert. Das zweite, wie Urik betont, funktioniert nicht, aber Uriks funktioniert auch nicht, da Distinct () beim Objektvergleich für anonyme Typen keine Gleichheit findet.
Alan Baljeu

9

So verbessern Sie die obige Antwort: Die ToTable-Funktion in der Datenansicht verfügt über ein "eindeutiges" Flag.

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

1
Dies scheint nicht zu funktionieren. Es gibt nur eine Überladung mit einem bestimmten Booleschen Parameter und es ist das Parameterarray erforderlich. Ich denke, dies wird nur eine Tabelle mit dem Namen "True" zurückgeben, ohne dass DISTINCT angewendet wird.
Pridegeekdad

2
+1 Dies funktioniert tatsächlich (zumindest in .NET 4.5). Wenn Sie den Booleschen Wert "True" als einzigen Parameter angeben, wird für alle Spalten in der DataView eine DISTINCT ausgeführt.
SetFreeByTruth

4

Folgende Arbeiten. Ich habe es für mich mit .NET 3.5 SP1 arbeiten

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

Ich habe gerade Folgendes gefunden: http://support.microsoft.com/default.aspx?scid=kb;en-us;326176#1

Auf der Suche nach etwas Ähnlichem, speziell für .net 2.0

Ich gehe davon aus, dass das OP bei der Verwendung von DataTable.Select () nach einer eindeutigen Suche gesucht hat. (Select () unterstützt keine eindeutigen)

Also hier ist der Code vom obigen Link:

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

Syntax:-

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

EX:-

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

2

Die einfachste Lösung besteht darin, LINQ zu verwenden und das Ergebnis dann in eine DataTable umzuwandeln

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

Dies gilt nur für asp.net 4.0 ^ Framework und benötigt den Verweis auf System.Data.DataSetExtensions, wie Ivan Ferrer Villa hervorhob


1
Vielleicht braucht es den Hinweis aufSystem.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 };

Es filtert Datentabellen mit Eecode und Taxyear, die zusammen als eindeutig betrachtet werden


0

es ist leicht

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

und dt2 datatable enthalten eindeutige Daten für column1, Column2..ColumnNth.


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

Hi @ GálGyula, willkommen bei Stack Overflow! Hier kümmern wir uns um Antworten mit guten Erklärungen, nicht nur um Code. Schreiben Sie eine Antwort nur, wenn sie die Frage wirklich löst und Sie erklären können, wie. Um Ihre zukünftigen Antworten zu verbessern, lesen Sie die Anleitung, wie ich eine gute Antwort schreibe .
Erick Petrucelli

-1

sthing wie?

SELECT DISTINCT .... FROM Tabelle WHERE Bedingung

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

Hinweis: Hausaufgabenfrage? und Gott segne Google ..

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


3
an wen auch immer mich herabgestimmt hat: S ,, offensichtlich wurde die Frage nach meiner Antwort geändert ?? (Antwort 10:15, Frage bearbeitet am 12:15) na ja .. danke für deine Unwissenheit :)
Madi D.

2
OP fragt, wie bestimmte Zeilen in einer C # ado.net-Umgebung und nicht in einer tatsächlichen Datenbank ausgewählt werden sollen.
Aggaton

-1
DataTable dtbs = new DataTable(); 
DataView dvbs = new DataView(dt); 
dvbs.RowFilter = "ColumnName='Filtervalue'"; 
dtbs = dvbs.ToTable();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.