2012-03-09 64 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 
    }