Jak wybrać odrębne wiersze w danych i przechowywać je w tablicy

167

Mam objds zbioru danych. objds zawiera tabelę o nazwie Tabela1. Tabela 1 zawiera kolumnę o nazwie ProcessName. Ta ProcessName zawiera powtarzające się nazwy, więc chcę wybrać tylko różne nazwy. Czy to możliwe.

  intUniqId[i] = (objds.Tables[0].Rows[i]["ProcessName"].ToString());
Ahmed Atia
źródło
Opublikuj przykładowy kod z komentarza, który przedstawiłeś poniżej, wydaje się, że odpowiedź zależy od specyfiki zapytania, nad którym pracujesz.
MatthewMartin

Odpowiedzi:

359
DataView view = new DataView(table);
DataTable distinctValues = view.ToTable(true, "Column1", "Column2" ...);
Thomas Levesque
źródło
jeśli mam dwie kolumny „mo” i „nazwa”, muszę uzyskać wyraźne „mo”, ale nie odrębne „imię”, ale muszę zachować kolumnę „nazwa” w moim pliku danych, co mam zrobić?
User7291,
1
@JocelyneElKhoury, to nie ma sensu ... jaką wartość „name” zachowasz wtedy?
Thomas Levesque,
@ThomasLevesque nie ma znaczenia, który z nich ... powiedzmy, że muszę zachować pierwszą wartość nazwy
User7291
17
OK, potrzebujesz grupowania, a nie odrębnych. Możesz to zrobić z Linq do DataSet:table.AsEnumerable().GroupBy(row => row.Field<int>("mo")).Select(group => group.First()).CopyToDataTable()
Thomas Levesque,
148

Wykonanie jednego wiersza kodu pozwoli uniknąć zduplikowanych wierszy a DataTable:

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

Gdzie:

  • pierwszy parametr w ToTable()jest wartością logiczną, która wskazuje, czy chcesz mieć oddzielne wiersze, czy nie.

  • Drugi parametr w ToTable()to nazwa kolumny, na podstawie której musimy wybrać różne wiersze. Tylko te kolumny będą w zwróconym pliku danych.

To samo można zrobić z a DataSet, uzyskując dostęp do określonego DataTable:

dataSet.Tables["Employee"].DefaultView.ToTable(true, "employeeid");
Rahul
źródło
5
Najbardziej podoba mi się ta odpowiedź, ponieważ wskazuje ona na DefaultViewwłaściwość a DataTable.
Ian Boyd,
Co się stanie, jeśli potrzebuję wyróżnienia na podstawie dwóch kolumn?
LCJ
1
@Lijo, ToTable(boolean, params string[] columnNames)metoda pozwala na określenie wielu kolumn.
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
źródło
30

Z 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
źródło
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
źródło
@Adi Lester: może wybierz nowy {kol1 = dRow ["kol1"], kol2 = dRow ["kol2"], ...}) .Distinct (); jest bardziej poprawne?
Urik
Jeśli masz tylko List <DataRow>, możesz to zrobić: var test = (z DataRow dRow w vm.LiveAssets wybierz dRow ["manname"]). Distinct ();
pat capozzi
Pierwsza linia działa. Drugi, jak wskazuje Urik, nie działa, ale Urik również nie działa, ponieważ Distinct () nie znajdzie równości podczas porównywania obiektów na typach anonimowych.
Alan Baljeu
9

Aby ulepszyć powyższą odpowiedź: Funkcja ToTable w widoku danych ma flagę „wyraźną”.

//This will filter all records to be distinct
dt = dt.DefaultView.ToTable(true);
Ravedave
źródło
1
To nie działa. Jest tylko jedno przeciążenie z wyraźnym parametrem logicznym i wymaga tablicy parametrów. Myślę, że to po prostu zwróci tabelę o nazwie „True” bez zastosowanego DISTINCT.
dumgeekdad
2
+1 To faktycznie działa (przynajmniej w .NET 4.5). Jeśli określisz wartość logiczną „True” jako jedyny parametr, wykona on DISTINCT na wszystkich kolumnach w DataView.
SetFreeByTruth
4

Kolejne prace. Mam to działa dla mnie z .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
źródło
3

Po prostu znalazłem to: http://support.microsoft.com/default.aspx?scid=kb;en-us;326176#1

Szukając czegoś podobnego, tylko specjalnie dla .net 2.0

Zakładam, że OP szukał czegoś innego podczas korzystania z DataTable.Select (). (Select () nie obsługuje różnych)

Oto kod z powyższego linku:

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
źródło
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
źródło
2

Składnia:-

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

DAWNY:-

DataTable uniqueCols = dsUDFlable.Tables[0].DefaultView.ToTable(true, "BorrowerLabelName");
user3639409
źródło
2

Najprostszym rozwiązaniem jest użycie LINQ, a następnie przekształcenie wyniku na DataTable

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

Dotyczy to tylko platformy asp.net 4.0 ^ Framework i wymaga odwołania do System.Data.DataSetExtensions, jak wskazał Ivan Ferrer Villa

Davide Castronovo
źródło
1
być może potrzebuje odniesienia doSystem.Data.DataSetExtensions
Ivan Ferrer Villa
1
var ValuetoReturn = (from Rows in YourDataTable.AsEnumerable()
select Rows["ColumnName"]).Distinct().ToList();
Dylan
źródło
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 };

Filtruje tabelę danych z kodem elektronicznym i taksówką łącznie uznawanych za unikalne

Viswa Teja Kuncham
źródło
0

to jest łatwe

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

a dt2 datatable zawierają unikalne dane kolumna1, kolumna2..kolumnaN-ta.

Manish Singh
źródło
0
objds.Table1.Select(r => r.ProcessName).AsEnumerable().Distinct();
Gál Gyula
źródło
Cześć @ GálGyula, witamy w Stack Overflow! Tutaj zależy nam na odpowiedziach z dobrymi wyjaśnieniami, a nie tylko kodem. Opublikuj odpowiedź tylko wtedy, gdy naprawdę rozwiąże to pytanie i możesz wyjaśnić, jak to zrobić. Aby poprawić swoje przyszłe odpowiedzi, zajrzyj do przewodnika, jak napisać dobrą odpowiedź .
Erick Petrucelli,
-1

coś jak?

SELECT DISTINCT .... FROM table WHERE warunek

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

uwaga: pytanie domowe? i niech Bóg błogosławi google ...

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

Madi D.
źródło
3
do kogokolwiek, kto mnie zlekceważył: S, oczywiście pytanie zostało zmodyfikowane po mojej odpowiedzi? (odpowiedź 10:15, pytanie zredagowano 12:15) no cóż .. dzięki za waszą ignorancję :)
Madi D.
2
OP pyta, jak wybrać różne wiersze w środowisku C # ado.net, a nie w rzeczywistej bazie danych.
aggaton
-1
DataTable dtbs = new DataTable(); 
DataView dvbs = new DataView(dt); 
dvbs.RowFilter = "ColumnName='Filtervalue'"; 
dtbs = dvbs.ToTable();
Packiyaraj Shanmugam
źródło