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());
Ahmed Atia
quelle
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" ...);
Thomas Levesque
quelle
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");
Rahul
quelle
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();
Martin Moser
quelle
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); }
Zain Ali
quelle
15

Sie können so verwenden:

data ist DataTable

data.DefaultView.ToTable(true, "Id", "Name", "Role", "DC1", "DC2", "DC3", "DC4", "DC5", "DC6", "DC7");  

aber die Leistung wird nachlassen. Versuchen Sie, den folgenden Code zu verwenden:

data.AsEnumerable().Distinct(System.Data.DataRowComparer.Default).ToList();  

Für die Leistung; http://onerkaya.blogspot.com/2013/01/distinct-dataviewtotable-vs-linq.html

Onerkaya
quelle
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
quelle
@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);
Ravedave
quelle
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);
Vijay Balani
quelle
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
    }
}
Gideon
quelle
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
quelle
2

Syntax:-

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

EX:-

DataTable uniqueCols = dsUDFlable.Tables[0].DefaultView.ToTable(true, "BorrowerLabelName");
user3639409
quelle
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

Davide Castronovo
quelle
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();
Dylan
quelle
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

Viswa Teja Kuncham
quelle
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.

Manish Singh
quelle
0
objds.Table1.Select(r => r.ProcessName).AsEnumerable().Distinct();
Gál Gyula
quelle
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=

Madi D.
quelle
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();
Packiyaraj Shanmugam
quelle