Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并数据表但忽略重复的行_C# - Fatal编程技术网

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

C# 合并数据表但忽略重复的行,c#,C#,我有以下代码,它是sharepoint 2010的自定义人员选择器 它按用户名搜索,也按人名搜索。 因为它包含搜索,如果我尝试使用部分用户名:cia 它显示我的重复行,因为这与用户名和人名匹配 这是我的代码(我不能使用LINQ: protected override int IssueQuery(string search, string groupName, int pageIndex, int pageSize) { try { // Find any u

我有以下代码,它是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;
通常,该方法会隐式删除重复项,但仅当所有列的值相同时

我不确定是否有更简单的东西(您已经提到您不能使用LINQ),但您可以合并两者,然后删除重复项:

List<string> dupColumns = new List<string>();
dupColumns.Add("ColumnA");
dupColumns.Add("ColumnB");
table2.Merge(table,);
RemoveDuplicates(table2, dupColumns);
List dupColumns=new List();
dupColumns.添加(“ColumnA”);
添加列。添加(“列B”);
表2.合并(表,);
移除的副本(表2,两列);
这里是删除重复项功能:

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++;
        }
    }
}
private void RemoveDuplicates(数据表、列表键列)
{
Dictionary uniquenessDict=新字典(table.Rows.Count);
System.Text.StringBuilder sb=null;
int rowIndex=0;
数据行;
DataRowCollection行=table.rows;
while(行索引<行数)
{
行=行[行索引];
sb=新的System.Text.StringBuilder();
foreach(keyColumns中的字符串colname)
{
sb.追加((字符串)行[colname]);
}
if(uniquenessDict.ContainsKey(sb.ToString()))
{
行。删除(行);
}
其他的
{
uniquenessDict.Add(sb.ToString(),string.Empty);
rowIndex++;
}
}
}
下面是一个示例代码

        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
    }
        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
    }