合并数据表但忽略重复的行

时间:2012-03-09 14:43:14

标签: c#

我有以下代码,它是sharepoint 2010的自定义人员选择器。

按用户名搜索,也按人名搜索。 因为它包含搜索,如果我尝试使用部分用户名: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;

2 个答案:

答案 0 :(得分: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 :(得分: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
    }