データテーブルの個別の行を選択して配列に格納する方法


169

データセットオブジェクトがあります。objdsにはTable1という名前のテーブルが含まれています。Table1には、ProcessNameという名前の列が含まれています。このProcessNameには繰り返される名前が含まれているため、個別の名前のみを選択します。これは可能ですか?

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

以下のコメントからサンプルコードを投稿してください。答えは、使用しているクエリの詳細にかかっているようです。
MatthewMartin、2009

回答:


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


2つの列「mo」と「name」がある場合、個別の「mo」を取得する必要がありますが、個別の「name」を取得する必要はありませんが、データテーブルに「name」列を保持する必要がありますか?
User7291 2013

1
@JocelyneElKhoury、それは本当に意味がありません...「名前」のどの値を保持しますか?
Thomas Levesque

@ThomasLevesqueそれはどちらでもかまいません...名前の最初の値を保持する必要があるとしましょう
User7291

17
わかりました、それではグループ化が必要です。Linq to DataSetでそれを行うことができます:table.AsEnumerable().GroupBy(row => row.Field<int>("mo")).Select(group => group.First()).CopyToDataTable()
Thomas Levesque

148

次の1行のコードは、aの重複行を回避しますDataTable

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

どこ:

  • の最初のパラメータToTable()は、個別の行が必要かどうかを示すブール値です。

  • の2番目のパラメータは、ToTable()個別の行を選択する必要がある基準となる列名です。これらの列のみが返されるデータテーブルに含まれます。

同じことをDataSet特定のにアクセスすることで、から行うことができますDataTable

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

5
それがのDefaultViewプロパティを指すので、私はこの答えが最も好きDataTableです。
Ian Boyd

2つの列に基づいて区別する必要がある場合はどうなりますか?
LCJ

1
@Lijo、このToTable(boolean, params string[] columnNames)メソッドでは、複数の列を指定できます。
クリステン・ハンマック

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); }

15

あなたはそのように使うことができます:

data です DataTable

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

ただし、パフォーマンスは低下します。以下のコードを使用してみてください:

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

パフォーマンスのために; http://onerkaya.blogspot.com/2013/01/distinct-dataviewtotable-vs-linq.html


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:多分new {col1 = dRow ["col1"]、col2 = dRow ["col2"]、...})を選択します)Distinct(); より正しいですか?
Urik

List <DataRow>がある場合、これを行うことができます。var test =(vm.LiveAssetsのDataRow dRowから、dRow ["manname"])を選択します。Distinct();
pat capozzi 2013

最初の行が機能します。2番目は、Urikが指摘しないように機能しませんが、匿名型でオブジェクト比較を実行するときにDistinct()が等価を見つけられないため、Urikも機能しません。
アランBaljeu

9

上記の答えを改善するには:データビューのToTable関数に「個別」フラグがあります。

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

1
これは機能していないようです。個別のブール型パラメーターを持つオーバーロードは1つだけであり、パラメーター配列が必要です。DISTINCTが適用されていない「True」というテーブルが返されるだけだと思います。
proudgeekdad

2
+1これは実際に機能します(少なくとも.NET 4.5では)。ブール値 "True"を唯一のパラメーターとして指定すると、DataViewのすべての列でDISTINCTが実行されます。
SetFreeByTruth 2013年

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専用

IMが、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");

EX:-

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 ^フレームワークでのみ有効で、Ivan Ferrer Villaが指摘したようにSystem.Data.DataSetExtensionsへ参照が必要です。


1
おそらくそれへの参照が必要ですSystem.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と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テーブルのWHERE条件

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

注:宿題の質問?そして神はGoogleを祝福します。

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


3
私に反対票を投じた人に:S、明らかに質問は私の回答の後に変更されましたか?(回答10:15、質問は12:15に編集)まあ.. thxの無知:)
マディD.

2
OPは、実際のデータベースではなく、C#ado.net環境で個別の行を選択する方法を要求します。
aggaton 2016年

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