就象 select distinct 字段名 from 表名  一样
在datatable中的select 应该怎么做啊

解决方案 »

  1.   

    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});
                }
            }
            if (ds != null) 
                ds.Tables.Add(dt);
            return dt;
    }
      

  2.   

    如果有LINQ的话就好办……
    没有的话,有个笨方法,定义另一个datatable,
    从现在的数据源里取不重复的部分写入到新的dt中
      

  3.   

    没找到ColumnEqual,请问要using什么才有这个啊,而且我在MSDN中也没索引到,可以讲讲吗
      

  4.   

    思路:首先建立一个临时数据表,然后把源DataTable Sort起来,然后逐行读取源数据,并且跟最后一次添加的数据比较,如果相同,则不添加,如果不同,则添加进临时表。做点小改动,则可以适应更多环境。public DataTable SelectDistinct(string TableName, DataTable SourceTable, string[] FieldNames)
    {
    DataTable dt = new DataTable(TableName);
    System.Text.StringBuilder FiledNameBuilder = new System.Text.StringBuilder("");
    string SortStr = ""; foreach (string FieldName in FieldNames)
    {
    dt.Columns.Add(FieldName, SourceTable.Columns[FieldName].DataType);
    FiledNameBuilder.Append(FieldName + ",");
    } if (FiledNameBuilder.ToString().Length>0)
    {
    SortStr = FiledNameBuilder.ToString();
    SortStr = SortStr.Substring(0,SortStr.Length-1);
    } object[] LastValue = new object[FieldNames.Length];

    foreach (DataRow dr in SourceTable.Select("",SortStr))
    {
    if (LastValue == null || !IsEqual(dr,LastValue))
    {
    for (int i = 0; i < LastValue.Length; i++)
    {
    LastValue[i] = dr[FieldNames[i]];
    }
    dt.Rows.Add(LastValue);
    }
    }
    if (ds != null)
    ds.Tables.Add(dt);
    return dt;
    } private bool IsEqual(DataRow dr, object[] Value)
    {
    bool Equal = true;
    int current = 0; while (Equal && current < Value.Length)
    {
    if (!dr[current].Equals(Value[current]))
    {
    Equal = false;
    }
    else
    {
    current++;
    }
    } return Equal;
    }
      

  5.   

    没找到ColumnEqual,请问要using什么才有这个啊,而且我在MSDN中也没索引到,可以讲讲吗哈,不好意思,那个是单独的方法:private bool ColumnEqual(object A, object B)
    {
            if ( A == DBNull.Value && B == DBNull.Value ) //  两个都是 DBNull.Value
                return true; 
            if ( A == DBNull.Value || B == DBNull.Value ) //  只有一个是 DBNull.Value
                return false; 
            return ( A.Equals(B) );  // 正常比较
    }
      

  6.   

    if (!dr[current].Equals(Value[current]))又一个错误,修改成if (!ColumnEqual(dr[current],Value[current]))