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

Anda bisa menggunakan seperti itu:

data adalah DataTable

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

tetapi kinerjanya akan turun. coba gunakan kode di bawah ini:

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

Untuk Kinerja; http://onerkaya.blogspot.com/2013/01/distinct-dataviewtotable-vs-linq.html

onerkaya
sumber
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
sumber
@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);
Raveave
sumber
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);
Vijay Balani
sumber
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
    }
}
Gideon
sumber
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
sumber
2

Sintaksis:-

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

EX:-

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

Davide Castronovo
sumber
1
mungkin perlu referensi keSystem.Data.DataSetExtensions
Ivan Ferrer Villa
1
var ValuetoReturn = (from Rows in YourDataTable.AsEnumerable()
select Rows["ColumnName"]).Distinct().ToList();
Dylan
sumber
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

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

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

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