我有一个带有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之间。
由于
答案 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)