【发布时间】:2015-04-12 06:55:40
【问题描述】:
我有一个数据库,其中每个电子邮件地址都应该属于一个唯一的客户,但我有很多重复项。我使用 sql 查询列出客户 ID、电子邮件地址对,每次出现多个客户 ID 映射到单个电子邮件地址。结果看起来像这样(更改地址以保护无辜者)
Customer ID Email
101233 bob@myaddress.com
108993 bob@myaddress.com
113224 bob@myaddress.com
89223 mary@otherdomain.com
188223 mary@otherdomain.com
在 c# 中,我将其填充到一个名为 dt 的 DataTable 中,其中包含 722 行。我用它来制作第二个名为 distinctTbl 的 DataTable,它有 344 行,只包含不同的电子邮件地址:
DataTable distinctTbl = dt.AsDataView().ToTable(true, "Email");
我正在尝试使用嵌套循环为每个电子邮件地址创建一个整数列表(客户 ID):
foreach (DataRow dr in distinctTbl.Rows)
{
// for each email address:
List<int> idNums = new List<int>();
foreach (DataRow myRow in dt.Rows)
{
// for every customerID / email pair in the original table
if (myRow["Email"] == dr["Email"])
{
idNums.Add((int)myRow["CustomerID"]);
}
}
// Do something with the List<int> before exiting outside loop
}
当我运行这段代码时,每个整数列表都包含一个值。该值是正确的,但每个电子邮件地址至少应该有两个。我已经进行了足够的调试以发现它始终正确识别第一个,但跳过任何后续匹配。我确定我遗漏了一些明显的东西,但是有人看到发生了什么吗?
【问题讨论】:
-
如果您将内部循环
foreach (DataRow myRow in dt.Rows)更改为for loop会怎样,因此声明类似列数int iColCount = distinctTbl.Columns.Count;然后遍历每一行的列.. 如果没有则声明一个var intCnt = 0;在内部 foreach 循环之外,然后检查是否myRow[intCnt]["Email] == (string)dr["Email"]然后添加必要的项目