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

时间:2014-08-29 22:06:34

标签: c#

我在循环中写入循环以写入数据表,但它会产生重复。我不确定这里的问题是什么。由于此循环,我从此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"]);
      }
   }
}

2 个答案:

答案 0 :(得分:4)

这似乎只是一个显示问题。你有一个嵌套循环,你在添加新行时循环表中的所有行。这意味着您输出所有新行。在开始时,您只看到一个新创建的行。但在第二个用户,你正在再次看到第一行。

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

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

另外,您不需要对usingDataTable使用DataSet - 语句。它不使用非托管资源。 using将阻止您进一步处理或从方法返回它。但这是一个例外,一般来说,最好的做法是将using - 语句用于实现IDisposable的所有内容。

答案 1 :(得分:1)

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