如何选择数据表中的不同行并存储到数组中

时间:2009-07-29 10:03:52

标签: c# select datatable distinct

我有一个数据集objds。 objds包含一个名为Table1的表。 Table1包含名为ProcessName的列。这个ProcessName包含重复的名称。所以我想只选择不同的名称。这是可能的。

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

17 个答案:

答案 0 :(得分:340)

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

答案 1 :(得分:136)

单行代码将避免DataTable的重复行:

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

其中:

  • ToTable()中的第一个参数是布尔,表示您是否需要不同的行。

  • ToTable()中的第二个参数是列名,我们必须根据该名称选择不同的行。只有这些列将在返回的数据表中。

通过访问特定的DataSetDataTable也可以这样做:

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

答案 2 :(得分: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();

答案 3 :(得分:29)

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

答案 4 :(得分:15)

您可以这样使用:

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

答案 5 :(得分: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();

答案 6 :(得分:9)

改进上述答案:dataview上的ToTable函数有一个“distinct”标志。

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

答案 7 :(得分: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);

答案 8 :(得分:3)

我碰巧发现了这个: http://support.microsoft.com/default.aspx?scid=kb;en-us;326176#1

在寻找类似的东西时,只有专门针对.net 2.0

我假设OP在使用DataTable.Select()时正在寻找不同的东西。 (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
    }
}

答案 9 :(得分:2)

语法: -

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

EX: -

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

答案 10 :(得分:1)

var ValuetoReturn = (from Rows in YourDataTable.AsEnumerable()
select Rows["ColumnName"]).Distinct().ToList();

答案 11 :(得分: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过滤数据表,并将其视为唯一

答案 12 :(得分:0)

最简单的解决方案是使用linq,然后将结果转换为DataTable

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

这是有效的 对于asp.net 4.0 ^ Framework 如果我记得的话。

答案 13 :(得分:0)

很简单

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

和dt2数据表包含column1,Column2..ColumnNth个唯一数据。

答案 14 :(得分:0)

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

答案 15 :(得分:-1)

@POST("?json={input}")
Call<Response> getResponseWithID(@Path("input") String input);

答案 16 :(得分:-2)

像sthing一样?

SELECT DISTINCT .... FROM table WHERE condition

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

注意:作业问题?和上帝保佑谷歌..

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