在遍历It时检测Datatable列中的重复值

时间:2010-03-17 10:41:35

标签: ado.net

我有一个带有Id(guid)和Name(字符串)列的数据表。我遍历数据表并在名称上运行验证标准(例如,它应该只包含字母和数字),然后将相应的Id添加到列表中如果名称通过验证。

如下所示: -

List<Guid> validIds=new List<Guid>();
foreach(DataRow row in DataTable1.Rows)
{
      if(IsValid(row["Name"])
        {
            validIds.Add((Guid)row["Id"]);
        }

}

除了这个验证之外,我还应该检查如果名称在整个数据表中不重复(即使是区分大小写),如果重复,我不应该在列表中添加相应的Id。

我在想/已经考虑过的事情: -

1)我可以有另一个List,检查同一个“Name”,如果存在,将添加相应的Guild 2)我不能使用HashSet,因为它会将“Test”和“test”视为不同的字符串而不是重复。 3)将DataTable带到另一个我有disctict名称的地方(我没试过,代码可能不正确,请尽可能纠正我)

DataTable dataTableWithDistinctName = new DataTable();
dataTableWithDistinctName.CaseSensitive=true
CopiedDataTable=DataTable1.DefaultView.ToTable(true,"Name");

我会遍历原始数据表并检查CopiedDataTable中是否存在“名称”,如果存在,我不会将ID添加到列表中。

有没有更好更好的方法来实现同样的目标?我需要始终考虑性能。虽然SO中有很多相关问题,但我没有发现类似的问题。如果你能指出一个与此相似的问题,那将会很有帮助。

编辑: - 记录数量可能在2000-3000之间。

由于

2 个答案:

答案 0 :(得分:1)

如果你想要防止重复,那可能是一项艰苦的工作,我不知道你一次处理多少条记录...如果是一小组,我会考虑在每次尝试之前做一个查询根据

从您的实时源插入
select COUNT(*) as CountOnFile from ProductionTable where UPPER(name) = UPPER(name from live data).  

如果结果集CountOnFile&gt; 0,不要添加。

如果您正在处理大型数据集,例如批量导入,我会将所有数据拉入临时表,然后执行查询,其中NOT IN ...类似

create table OkToBeAdded as 
select distinct upper( TempTable.Name ) as Name, GUID
  from TempTable
  where upper( TempTable.Name ) 
      NOT IN ( select upper( LiveTable.Name )
                 from LiveTable
                 where upper( TempTable.Name ) = upper( LiveTable.Name )
             );

insert into LiveTable ( Name, GUID )
  select Name, GUID from OkToBeAdded;

显然,SQL是示例,需要根据您的特定后端源进行调整

答案 1 :(得分:0)

    /* I did this entirely in SQL and avoided ADO.NET*/

    /*I Pass the CSV of valid object Ids and split that in a table*/

DECLARE @TableTemp TABLE        
(        
    TempId uniqueidentifier      
)        
INSERT INTO @TableTemp 
SELECT cast(Data AS uniqueidentifier )AS ID FROM dbo.Split1(@ValidObjectIdsAsCSV,',')    


/*Self join with table1 for any duplicate rows and update the column value*/    
UPDATE Table1 
SET IsValidated=1
FROM Table1 AS A INNER JOIN @TableTemp AS Temp
ON A.ID=Temp.TempId 
WHERE NOT EXISTS (SELECT Name,Count(Name) FROM Table1 
WHERE A.Name=B.Name
GROUP BY Name HAVING Count(Name)>1)