循环中的循环会在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"]);
      }
   }
}

循环中的循环会在DataTable C#中创建重复项

这似乎只是一个显示问题。您有一个嵌套循环,在添加新行时循环表中的所有行。这意味着您输出所有新行。在开头,您只看到一个新创建的行。但在第二个用户处,您已经阅读了第一行。

这修复了它,将内部循环移动到主循环后面:

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"]);
}

顺便说一句,DataTableDataSet不需要使用using-语句。它不使用非托管资源。否则,using将阻止您进一步处理或从该方法返回它。但这是一个例外,通常最好对实现IDisposable的所有内容使用using-语句。

这只是一个显示问题。您的foreachConsole.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"]);
}