2012-03-09 59 views
3

我有下面的代码,它是一个自定义的人员选取器在2010年的SharePoint合并数据表而忽略重复的行

它搜索的用户名,但也被人名字。 由于其中包含搜索,如果我尝试使用我的部分用户名:cia

它显示我的重复行,因为它匹配用户名,但也是人名。

这是我的代码(我不能使用LINQ:

protected override int IssueQuery(string search, string groupName, int pageIndex, int pageSize) 
{ 
    try 
    { 
     // Find any user that has a matching name 
     var table = ADHelper.ExecuteNameQuery(RootPath, search); 

     // 20249: Search by username, method was already done, but it was not being called. 
     var table2 = ADHelper.ExecutesAMAccountNameQuery(search); 
     table2.Merge(table,); 
     PickerDialog.Results = table2; 

回答

7

通常情况下,DataTable.Merge方法隐含删除重复,但只有当所有列的值相同

我不知道。有一些simplier(你提到你不能使用LINQ),但你可以合并双方事后删除重复的:在REM

List<string> dupColumns = new List<string>(); 
dupColumns.Add("ColumnA"); 
dupColumns.Add("ColumnB"); 
table2.Merge(table,); 
RemoveDuplicates(table2, dupColumns); 

这里OVE-重复功能:

private void RemoveDuplicates(DataTable table, List<string> keyColumns) 
{ 
    Dictionary<string, string> uniquenessDict = new Dictionary<string, string>(table.Rows.Count); 
    System.Text.StringBuilder sb = null; 
    int rowIndex = 0; 
    DataRow row; 
    DataRowCollection rows = table.Rows; 
    while (rowIndex < rows.Count) 
    { 
     row = rows[rowIndex]; 
     sb = new System.Text.StringBuilder(); 
     foreach (string colname in keyColumns) 
     { 
      sb.Append(((string)row[colname])); 
     } 

     if (uniquenessDict.ContainsKey(sb.ToString())) 
     { 
      rows.Remove(row); 
     } 
     else 
     { 
      uniquenessDict.Add(sb.ToString(), string.Empty); 
      rowIndex++; 
     } 
    } 
} 
1
you should the .ToTable function 

这里是一个示例代码

 DataTable DT1 = new DataTable(); 
    DT1.Columns.Add("c_" + DT1.Columns.Count); 
    DT1.Columns.Add("c_" + DT1.Columns.Count); 
    DT1.Columns.Add("c_" + DT1.Columns.Count); 

    DataRow DR = DT1.NewRow(); 
    DR[0] = 0; 
    DR[1] = 1; 
    DR[2] = 2; 
    DT1.Rows.Add(DR); 

    DataTable DT2 = new DataTable(); 
    DT2.Columns.Add("c_" + DT2.Columns.Count); 
    DT2.Columns.Add("c_" + DT2.Columns.Count); 
    DT2.Columns.Add("c_" + DT2.Columns.Count); 
    DT2.Columns.Add("c_" + DT2.Columns.Count); 

    DR = DT2.NewRow(); 
    DR[0] = 0; 
    DR[1] = 1; 
    DR[2] = 2; 
    DR[3] = 3; 
    DT2.Rows.Add(DR); 

    DT1.Merge(DT2); 
    Trace.IsEnabled = true; 
    DataTable DT_3=DT1.DefaultView.ToTable(true,new string[]{"c_1","c_2","c_0"}); 
    foreach (DataRow CDR in DT_3.Rows) 
    { 
     Trace.Warn("val",CDR[1]+"");//you will find only one data row 
    }