如何在DataTable中选择不同的行并存储到数组中

189

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

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

从您下面的评论中可以看出,答案取决于您正在处理的查询的具体细节。请发布示例代码。 - MatthewMartin
18个回答

3
我刚好找到了这个: http://support.microsoft.com/default.aspx?scid=kb;en-us;326176#1 当我在寻找类似的东西时,只是特别针对 .net 2.0。
我假设 OP 在使用 DataTable.Select() 时正在寻找 distinct。(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
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
最简单的解决方案是使用LINQ,然后将结果转换为DataTable。
    //data is a DataTable that you want to change
    DataTable result = data.AsEnumerable().Distinct().CopyToDataTable < DataRow > ();

这仅适用于asp.net 4.0 ^框架,需要引用System.Data.DataSetExtensions,正如Ivan Ferrer Villa所指出的那样。


1
也许需要引用 System.Data.DataSetExtensions - Ivan Ferrer Villa

2
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
objds.Table1.Select(r => r.ProcessName).AsEnumerable().Distinct();

嗨,@GálGyula,欢迎来到Stack Overflow!在这里,我们关心有良好解释的答案,而不仅仅是代码。只有当您真正解决了问题并且能够解释清楚时才发布答案。为了改善您未来的回答,请查看指南如何撰写好的答案 - Erick Petrucelli

-1
DataTable dtbs = new DataTable(); 
DataView dvbs = new DataView(dt); 
dvbs.RowFilter = "ColumnName='Filtervalue'"; 
dtbs = dvbs.ToTable();

-2

3
给那些踩我回答的人:显然,在我回答问题后,问题被修改了?(我在10:15回答,问题在12:15被编辑)无论怎样,感谢你们的无知。请注意,这里不含解释。 - Madi D.
4
OP询问如何在C# ado.net环境中选择不同的行,而不是在实际数据库中选择。 - aggaton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接