Cara memilih baris yang berbeda di dalam dataat dan menyimpan ke dalam array


169

Saya memiliki keberatan dataset. objds berisi tabel bernama Table1. Table1 berisi kolom bernama ProcessName. Nama Proses ini mengandung nama berulang. Jadi saya ingin memilih hanya nama yang berbeda. Apakah ini mungkin.

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

Kirim kode sampel, dari komentar yang Anda buat di bawah, sepertinya jawabannya bergantung pada spesifikasi kueri yang Anda kerjakan.
MatthewMartin

Jawaban:


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


jika saya memiliki 2 kolom "mo" dan "name" saya harus mendapatkan "mo" yang berbeda tetapi bukan "nama" yang berbeda tetapi saya perlu menyimpan kolom "nama" di dalam data saya apa yang harus saya lakukan?
User7291

1
@JocelyneElKhoury, itu tidak masuk akal ... nilai "nama" mana yang akan Anda simpan?
Thomas Levesque

@ThomasLevesque tidak masalah yang mana ... katakanlah saya harus menyimpan nilai pertama dari nama
User7291

17
OK, maka Anda perlu pengelompokan, tidak berbeda. Anda bisa melakukannya dengan Linq ke DataSet:table.AsEnumerable().GroupBy(row => row.Field<int>("mo")).Select(group => group.First()).CopyToDataTable()
Thomas Levesque

148

Mengikuti satu baris kode akan menghindari baris duplikat dari DataTable:

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

Dimana:

  • Parameter pertama ToTable()adalah boolean yang menunjukkan apakah Anda ingin baris yang berbeda atau tidak.

  • Parameter kedua dalam ToTable()adalah nama kolom berdasarkan di mana kita harus memilih baris yang berbeda. Hanya kolom-kolom ini akan berada dalam datatable yang dikembalikan.

Hal yang sama dapat dilakukan dari DataSet, dengan mengakses spesifik DataTable:

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

5
Saya paling suka jawaban ini, karena menunjuk ke DefaultViewproperti a DataTable.
Ian Boyd

Bagaimana jika saya perlu membedakan berdasarkan dua kolom?
LCJ

1
@ Lijo, ToTable(boolean, params string[] columnNames)metode ini memungkinkan beberapa kolom untuk ditentukan.
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

Dengan 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: mungkin pilih baru {col1 = dRow ["col1"], col2 = dRow ["col2"], ...}) .Distinct (); lebih benar?
Urik

Ketika Anda baru saja memiliki Daftar <DataRow> Anda dapat melakukan ini: var test = (dari DataRow dRow di vm.LiveAssets pilih dRow ["manname"]). Distinct ();
pat capozzi

Baris pertama berfungsi. Yang kedua, seperti yang Urik tunjukkan tidak, tetapi Urik juga tidak berfungsi sebagai Distinct () tidak akan menemukan kesetaraan ketika melakukan objek-bandingkan pada tipe anonim.
Alan Baljeu

9

Untuk meningkatkan jawaban di atas: Fungsi ToTable pada tampilan data memiliki bendera "berbeda".

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

1
Tampaknya ini tidak berfungsi. Hanya ada satu kelebihan dengan parameter Boolean yang berbeda di dalamnya dan itu membutuhkan array parameter. Saya pikir ini hanya akan mengembalikan tabel yang disebut "Benar" tanpa ada PERUBAHAN yang diterapkan.
proudgeekdad

2
+1 Ini benar-benar berfungsi (setidaknya dalam .NET 4.5). Jika Anda menentukan nilai Boolean "True" sebagai satu-satunya parameter, ia melakukan PERBEDAAN pada semua kolom di DataView.
SetFreeByTruth

4

Berikut karya-karya. Saya memilikinya bekerja untuk saya dengan. 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

Saya kebetulan menemukan ini: http://support.microsoft.com/default.aspx?scid=kb;en-us;326176#1

Sambil mencari sesuatu yang serupa, hanya, khusus untuk .net 2.0

Saya berasumsi OP sedang mencari berbeda saat menggunakan DataTable.Select (). (Pilih () tidak mendukung perbedaan)

Jadi di sini adalah kode dari tautan di atas:

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

Sintaksis:-

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

EX:-

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

2

Solusi paling sederhana adalah dengan menggunakan LINQ dan kemudian mentransformasikan hasilnya menjadi DataTable

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

Ini hanya valid untuk asp.net 4.0 ^ Framework dan perlu referensi ke System.Data.DataSetExtensions seperti yang ditunjukkan oleh Ivan Ferrer Villa


1
mungkin perlu referensi keSystem.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 };

Ini memfilter tabel data dengan eecode dan taxyear secara bersama-sama dianggap unik


0

ini mudah

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

dan dt2 datatable berisi column1, Column2..ColumnNth data unik.


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

Hai @ GálGyula, selamat datang di Stack Overflow! Di sini kami memperhatikan jawaban dengan penjelasan yang baik, bukan hanya kode. Hanya posting jawaban jika itu benar-benar menyelesaikan pertanyaan dan Anda dapat menjelaskan caranya. Untuk meningkatkan jawaban Anda di masa mendatang, lihat panduan ini bagaimana cara menulis jawaban yang baik .
Erick Petrucelli

-1

seperti apa?

SELECT DISTINCT .... DARI table WHERE condition

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

Catatan: Pertanyaan PR? dan tuhan memberkati google ..

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


3
kepada siapa pun yang memilih saya: S ,, jelas pertanyaannya diubah setelah jawaban saya ?? (jawaban 10:15, pertanyaan diedit pada 12:15) oh baiklah .. terima kasih atas ketidaktahuanmu :)
Madi D.

2
OP menanyakan cara memilih baris berbeda di lingkungan C # ado.net, bukan di basis data aktual.
aggaton

-1
DataTable dtbs = new DataTable(); 
DataView dvbs = new DataView(dt); 
dvbs.RowFilter = "ColumnName='Filtervalue'"; 
dtbs = dvbs.ToTable();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.