2012-03-09 2 views
3

Я следующий код, его обычай выбора людей для SharePoint 2010.Слияние DataTables но игнорировать дублированные строки

он ищет по имени пользователя, но и по имени человека. Поскольку он содержит поиск, если я попробую с частью моего имени пользователя: 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 удаляет дубликаты неявным Но только тогда, когда значения всех столбцов являются одинаковыми

Я не уверен, если.. есть что-то проще (вы упомянули, что вы не можете использовать LINQ), но вы могли бы объединить как и удалить дубликаты впоследствии:

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

а вот бэр Уве-дублирует функции:

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 
    }