Veri tablosundaki farklı satırları seçme ve bir dizi halinde saklama


169

Veri kümesi itirazlarım var. objds, Table1 adlı bir tablo içerir. Tablo1, İşlemAdı adlı bir sütun içerir. Bu ProcessName tekrarlanan isimler içerir.Bu yüzden sadece farklı isimler seçmek istiyorum.Bu mümkün.

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

Örnek kod yayınlayın, aşağıda yaptığınız bir yorumdan yanıt, birlikte çalıştığınız sorgunun özelliklerine bağlı görünüyor.
MatthewMartin

Yanıtlar:


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


2 sütun "mo" ve "adı" varsa ben farklı "mo" almak gerekir ama farklı "adı" değil ama benim datatable sütun "adı" tutmak gerekir ne yapmalıyım?
Kullanıcı7291

1
@JocelyneElKhoury, bu gerçekten mantıklı değil ... o zaman hangi "isim" değerini koruyacaksın?
Thomas Levesque

@ThomasLevesque hangisi önemli değil ... diyelim ki ismin ilk değerini
tutmalıyım

17
Tamam, o zaman farklı değil gruplamaya ihtiyacınız var. Bunu Linq ile DataSet'e yapabilirsiniz:table.AsEnumerable().GroupBy(row => row.Field<int>("mo")).Select(group => group.First()).CopyToDataTable()
Thomas Levesque

148

Aşağıdaki tek kod satırı, a'nın yinelenen satırlarından kaçınacaktır DataTable:

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

Nerede:

  • içindeki ilk parametre, farklı satırlar isteyip istemediğinizi gösteren ToTable()bir boolean değeridir .

  • içindeki ikinci parametre, ToTable()ayrı satırları seçmemiz gereken sütun adıdır. Yalnızca bu sütunlar döndürülen veri tablosunda olacaktır.

Aynı şey, DataSetbelirli bir öğeye erişerek a'dan yapılabilir DataTable:

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

5
ben DefaultViewbir özelliği işaret ettiği gibi, bu cevap en çok seviyorum DataTable.
Ian Boyd

İki sütuna göre ayırt edilmem gerekirse ne olur?
LCJ

1
@Lijo, ToTable(boolean, params string[] columnNames)yöntem birden çok sütunun belirtilmesine izin verir.
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

LINQ ile (.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: belki yeni {col1 = dRow ["col1"], col2 = dRow ["col2"], ...}) .Distinct (); daha doğru mu?
13'te Urik

Sadece <DataRow> Listeniz olduğunda bunu yapabilirsiniz: var test = (vm.LiveAssets içindeki DataRow dRow öğesinden dRow ["manname"] öğesini seçin). Distinct ();
pat capozzi

İlk satır çalışır. İkincisi, Urik'in işaret etmediği gibi, Urik'in de çalışmadığı gibi Distinct (), anonim türlerde nesne karşılaştırma yaparken eşitlik bulamaz.
Alan Baljeu

9

Yukarıdaki cevabı geliştirmek için: Veri görünümündeki ToTable fonksiyonunun "farklı" bayrağı vardır.

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

1
Bu işe yaramıyor gibi görünüyor. İçinde farklı bir Boolean parametresi olan tek bir aşırı yük var ve parametre dizisini gerektiriyor. Bu sadece herhangi bir DISTINCT uygulanmış olmadan "True" adlı bir tablo dönecektir düşünüyorum.
proudgeekdad

2
+1 Bu gerçekten işe yarıyor (en azından .NET 4.5'te). Boole değerini "True" olarak tek parametre olarak belirtirseniz, DataView içindeki tüm sütunlarda bir DISTINCT gerçekleştirir.
SetFreeByTruth

4

Aşağıdaki çalışmalar. .NET 3.5 SP1 ile benim için çalışıyor

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

Bunu buldum: http://support.microsoft.com/default.aspx?scid=kb;en-us;326176#1

Benzer bir şey ararken, yalnızca .net 2.0 için

Im DataTable.Select () kullanırken farklı aradığını varsayarak. (Seç () farklı desteklemiyor)

İşte yukarıdaki linkten kod:

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

Sözdizimi:-

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

EX: -

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

2

En basit çözüm LINQ kullanmak ve ardından sonucu bir DataTable'a dönüştürmektir.

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

Bu yalnızca asp.net 4.0 ^ Framework için geçerlidir ve Ivan Ferrer Villa'nın işaret ettiği gibi System.Data.DataSetExtensions referansına ihtiyaç duymaktadır.


1
belki de referans gerekiyorSystem.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 };

Eecode ve taxyear ile veri tablosunu bir arada benzersiz olarak değerlendirir


0

kolay

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

ve dt2 veri tablosu, column1, Column2..ColumnNth benzersiz verilerini içerir.


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

Merhaba @ GálGyula, Stack Overflow'a hoş geldiniz! Burada sadece kod değil, iyi açıklamaları olan cevapları önemsiyoruz. Sadece soruyu gerçekten çözerse ve nasıl olduğunu açıklayabilirsiniz. Gelecekteki cevaplarınızı iyileştirmek için nasıl iyi bir cevap yazacağım kılavuzuna bakın .
Erick Petrucelli

-1

3
Bana kim indirdi: S ,, açıkçası soru cevabımdan sonra değiştirildi ?? (cevap 10:15, soru 12:15 tarihinde düzenlendi) oh well .. ur cehalet için teşekkürler :)
Madi D.

2
OP, gerçek bir veritabanında değil, bir C # ado.net ortamında farklı satırların nasıl seçileceğini sorar.
aggaton

-1
DataTable dtbs = new DataTable(); 
DataView dvbs = new DataView(dt); 
dvbs.RowFilter = "ColumnName='Filtervalue'"; 
dtbs = dvbs.ToTable();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.