如何去掉DataTable中的重复行(新增.net 2.0中最新解决方法---简便)

.net 1.1中的解决方法(转)
1建立一个DataSetHelper类(DataSetHelper.cs)
public class DataSetHelper
{
    
public DataSet ds;
    
public DataSetHelper(ref DataSet DataSet)
    
{
        ds 
= DataSet;
    }

    
public DataSetHelper()
    
{
        ds 
= null;
    }

    
private bool ColumnEqual(object A, object B)
    
{
        
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
    }

    
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 建立一个Web窗体,在page_load中写下面的代码
       DataSet ds;
        DataSetHelper dsHelper;
        ds 
= new DataSet();
        dsHelper 
= new DataSetHelper(ref ds);

        
// Create source table
        DataTable dt = new DataTable("Orders");
        dt.Columns.Add(
"EmployeeID", Type.GetType("System.String"));
        dt.Columns.Add(
"OrderID", Type.GetType("System.Int32"));
        dt.Columns.Add(
"Amount", Type.GetType("System.Decimal"));

        dt.Rows.Add(
new object[] "Sam"525.00 });
        dt.Rows.Add(
new object[] "Tom"750.00 });
        dt.Rows.Add(
new object[] "Sue"911.00 });
        dt.Rows.Add(
new Object[] "Tom"127.00 });
        dt.Rows.Add(
new Object[] "Sam"14512.00 });
        dt.Rows.Add(
new Object[] "Sue"1517.00 });
        dt.Rows.Add(
new Object[] "Sue"222.50 });
        dt.Rows.Add(
new object[] "Tom"243.00 });
        dt.Rows.Add(
new object[] "Tom"3378.75 });

        ds.Tables.Add(dt);
       DataTable td
=dsHelper.SelectDistinct("DistinctEmployees", ds.Tables["Orders"], "EmployeeID");
       
this.GridView1.DataSource = td;
       
this.GridView1.DataBind();

 .net 2.0中的解决方法(原创)

public DataTable GetTopSearch()
        
{
            DataSet dsKeyword 
= dal.GetKeyword();
            DataSet dsTopSearch 
= new DataSet();
            
for (int i = 0; i < 4; i++)
            
{
                
string keyword = dsKeyword.Tables[0].Rows[i]["Name"].ToString();
                
string condition = dsKeyword.Tables[0].Rows[i]["SearchCondition"].ToString();
                dsTopSearch.Merge(dal.GetTopSearch(keyword,condition));
            }

            
return dsTopSearch.Tables[0].DefaultView.ToTable(true"ID","Name","Author","Publisher","PublishDate","TypeName","Price","SalePrice","SavePrice","Rebate","ImagePath","ContentIntro");
        }


先把DataTable转成DataView,再通过DataView.ToTable()转回DataTable,ToTable()方法中有一个重载可以轻松消除重复行.
注:该重载的第二个参数为要保存的字段名.

posted @ 2008-02-17 23:14  pensir  阅读(2952)  评论(0编辑  收藏  举报