데이터 테이블에서 고유 한 행을 선택하고 배열에 저장하는 방법


167

데이터 세트 객체가 있습니다. objds에는 Table1이라는 테이블이 있습니다. Table1에는 ProcessName이라는 열이 있습니다. 이 ProcessName에 반복되는 이름이 포함되어 있으므로 고유 한 이름 만 선택하고 싶습니다.

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

아래의 주석에서 샘플 코드를 게시하면 작업중 인 쿼리의 세부 사항에 대한 답변이 응답하는 것처럼 보입니다.
MatthewMartin

답변:


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


두 열 "mo"와 "name"이있는 경우 고유 한 "mo"를 가져와야하지만 고유 한 "name"은 필요하지 않지만 데이터 테이블에 "name"열을 유지해야합니까?
User7291

1
@JocelyneElKhoury, 그건 말이되지 않습니다 ... 그렇다면 "name"의 어떤 가치를 유지할 것입니까?
Thomas Levesque

@ThomasLevesque 그것은 어느 것이 중요하지 않습니다 ... 말하자 이름의 첫 번째 값을 유지해야합니다
User7291

17
그렇다면 그룹화가 필요합니다. 당신은 DataSet에 Linq에 함께 할 수있다 :table.AsEnumerable().GroupBy(row => row.Field<int>("mo")).Select(group => group.First()).CopyToDataTable()
토마스 레베

148

한 줄의 코드를 따르면 DataTable: 의 중복 행을 피할 수 있습니다 .

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

어디:

  • 의 첫 번째 매개 변수는 ToTable()A는 부울 는 별개의 행이나하지 여부를 나타냅니다.

  • 의 두 번째 매개 변수는 ToTable()고유 한 행을 선택해야하는 열 이름입니다. 이 열만 리턴 된 데이터 테이블에 있습니다.

DataSet특정에 액세스하여 에서 동일한 작업을 수행 할 수 있습니다 DataTable.

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

5
DefaultView속성이 a 의 속성을 가리 키기 때문에이 답변이 가장 DataTable좋습니다.
Ian Boyd

두 개의 열을 기준으로 구별해야하는 경우 어떻게합니까?
LCJ

1
@Lijo,이 ToTable(boolean, params string[] columnNames)방법을 사용하면 여러 열을 지정할 수 있습니다.
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 (.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 : 아마도 새로운 {col1 = dRow [ "col1"], col2 = dRow [ "col2"], ...}) .Distinct (); 더 정확합니까?
Urik

List <DataRow> 만 있으면 다음을 수행 할 수 있습니다. var test = (vm.LiveAssets의 DataRow dRow에서 dRow [ "manname"]을 선택) .Distinct ();
pat capozzi

첫 번째 줄이 작동합니다. 두 번째로 Urik은 지적하지 않았지만 Urik은 익명 유형에서 객체 비교를 수행 할 때 Distinct ()가 평등을 찾지 못하므로 작동하지 않습니다.
Alan Baljeu

9

위의 답변을 향상 시키려면 : dataview의 ToTable 함수에는 "고유 한"플래그가 있습니다.

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

1
작동하지 않는 것 같습니다. 고유 한 부울 매개 변수가있는 과부하는 하나 뿐이며 매개 변수 배열이 필요합니다. DISTINCT를 적용하지 않고 "True"라는 테이블을 반환한다고 생각합니다.
proudgeekdad

2
+1 이것은 실제로 작동합니다 (적어도 .NET 4.5에서는). 부울 값 "True"를 유일한 매개 변수로 지정하면 DataView의 모든 열에 대해 DISTINCT가 수행됩니다.
SetFreeByTruth

4

다음 작품. .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

방금 이것을 찾았습니다 : http://support.microsoft.com/default.aspx?scid=kb;en-us;326176#1

.net 2.0 과 유사한 것을 찾고있는 동안

DataTable.Select ()를 사용하는 동안 OP가 고유 한 것을 찾고 있다고 가정합니다. (Select ()는 구별을 지원하지 않습니다)

위의 링크 코드는 다음과 같습니다.

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

통사론:-

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

전의:-

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

2

가장 간단한 해결책은 LINQ를 사용한 다음 결과를 DataTable로 변환하는 것입니다.

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

이것은 asp.net 4.0 ^ Framework에만 유효 하며 Ivan Ferrer Villa가 지적한 것처럼 System.Data.DataSetExtensions에 대한 참조가 필요합니다.


1
아마도 그것은에 대한 참조가 필요System.Data.DataSetExtensions
이반 페레 빌라

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 및 taxyear로 데이터 테이블을 필터링합니다.


0

쉽다

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

dt2 데이터 테이블은 column1, Column2..ColumnNth 고유 데이터를 포함합니다.


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

@ GálGyula 님, Stack Overflow에 오신 것을 환영합니다! 여기서 우리는 코드뿐만 아니라 좋은 설명으로 답변에 관심을 갖습니다. 실제로 문제를 해결하고 방법을 설명 할 수있는 경우에만 답변을 게시하십시오. 향후 답변을 개선하려면 안내서를 잘 작성하여 어떻게 작성해야하는지 살펴보십시오 .
Erick Petrucelli

-1

같은 것?

SELECT DISTINCT .... FROM table WHERE 조건

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

참고 : 숙제 질문? 신의 축복이있는 Google ..

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


3
누구에게 나를 downvoted : S, 분명히 질문은 내 대답 후에 수정되었습니다 ?? (답 10:15, 12:15에 편집 된 질문) 오 잘 .. ur 무지에 대한 thx :)
Madi D. 09.

2
OP는 실제 데이터베이스가 아닌 C # ado.net 환경에서 고유 한 행을 선택하는 방법을 묻습니다.
aggaton

-1
DataTable dtbs = new DataTable(); 
DataView dvbs = new DataView(dt); 
dvbs.RowFilter = "ColumnName='Filtervalue'"; 
dtbs = dvbs.ToTable();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.