循环中的循环会在DataTable C#中创建重复项
本文关键字:循环 创建 DataTable | 更新日期: 2023-09-27 18:19:58
我正在向循环中的循环写入数据表,但它会产生重复。我不确定这里可能有什么问题。作为这个循环的结果,我从这个API得到了重复的ID
var users = api.Users.GetAllUsers();
using (DataTable table = new DataTable())
{
var properties = users.Users[0].GetType().GetProperties();
for (int i = 0; i < properties.Count(); i++)
{
table.Columns.Add(properties[i].Name, typeof(String));
}
foreach (var user in users.Users)
{
DataRow newRow = table.NewRow();
for (int j = 0; j < properties.Count(); j++)
{
var colName = properties[j].Name;
newRow[colName] = user.GetType().GetProperty(colName).GetValue(user, null);
}
table.Rows.Add(newRow);
foreach (DataRow row in table.Rows)
{
Console.WriteLine(row["id"]);
}
}
}
这似乎只是一个显示问题。您有一个嵌套循环,在添加新行时循环表中的所有行。这意味着您输出所有新行。在开头,您只看到一个新创建的行。但在第二个用户处,您已经阅读了第一行。
这修复了它,将内部循环移动到主循环后面:
foreach (var user in users.Users)
{
DataRow newRow = table.NewRow();
for (int j = 0; j < properties.Count(); j++)
{
var colName = properties[j].Name;
newRow[colName] = user.GetType().GetProperty(colName).GetValue(user, null);
}
table.Rows.Add(newRow);
}
foreach (DataRow row in table.Rows)
{
Console.WriteLine(row["id"]);
}
顺便说一句,DataTable
或DataSet
不需要使用using
-语句。它不使用非托管资源。否则,using
将阻止您进一步处理或从该方法返回它。但这是一个例外,通常最好对实现IDisposable的所有内容使用using
-语句。
这只是一个显示问题。您的foreach
和Console.WriteLine
位于外部foreach
内部,因此它将在每次迭代中打印所有行。将打印移出外部foreach
:
foreach (var user in users.Users)
{
DataRow newRow = table.NewRow();
for (int j = 0; j < properties.Count(); j++)
{
var colName = properties[j].Name;
newRow[colName] = user.GetType().GetProperty(colName).GetValue(user, null);
}
table.Rows.Add(newRow);
}
foreach (DataRow row in table.Rows)
{
Console.WriteLine(row["id"]);
}