web-dev-qa-db-ja.com

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

データセットオブジェクトがあります。 objdsにはTable1という名前のテーブルが含まれています。 Table1には、ProcessNameという名前の列が含まれています。このProcessNameには重複した名前が含まれています。異なる名前だけを選択したいのです。

  intUniqId[i] = (objds.Tables[0].Rows[i]["ProcessName"].ToString());
154
Ahmed
DataView view = new DataView(table);
DataTable distinctValues = view.ToTable(true, "Column1", "Column2" ...);
341
Thomas Levesque

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

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

どこで:

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

  • ToTable()の2番目のパラメータは、異なる行を選択しなければならないカラム名です。返されるデータテーブルにはこれらの列のみが含まれます。

特定のDataSetにアクセスすることによって、DataTableから同じことができます。

dataSet.Tables["Employee"].DefaultView.ToTable(true, "employeeid");
136
Rahul
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();
57
Martin Moser

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); }
29
Zain Ali

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

dataDataTableです

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

15
onerkaya
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();
13
ces2601

上記の答えを改善するために:データビューのToTable関数は "distinct"フラグを持っています。

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

以下の作品。私はそれを.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);
4
Vijay Balani

たまたまこれが見つかりました。 http://support.Microsoft.com/default.aspx?scid=kb;en-us;326176#1

似たようなものを探している間に、.net 2.0の場合のみ、を指定してください

DataTable.Select()を使用しているときにOPが異なるオブジェクトを探していたとします。 (Select()はdistinctをサポートしていません)

だからここに上記のリンクからのコードです:

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
    }
}
3
gideon

構文:-

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

例: -

DataTable uniqueCols = dsUDFlable.Tables[0].DefaultView.ToTable(true, "BorrowerLabelName");
2
user3639409
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
Tanmay Nehete
var ValuetoReturn = (from Rows in YourDataTable.AsEnumerable()
select Rows["ColumnName"]).Distinct().ToList();
1
Dylan
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を組み合わせて一意と見なされるデータテーブルをフィルタリングします

1

最も簡単な解決策は、linqを使用してから結果をDataTableに変換することです。

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

私が覚えているならば、これはasp.net 4.0 ^ Frameworkに有効です。

0
objds.Table1.Select(r => r.ProcessName).AsEnumerable().Distinct();
0
Gál Gyula

簡単です

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

dt2データテーブルには、column1、Column2..ColumnNthの一意のデータが含まれます。

0
Manish Singh