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

C# 循环中的循环在DataTable C中创建重复项#,c#,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.Co

我正在写一个循环中的循环来写一个数据表,但它会产生重复项。我不确定这里会有什么问题。由于这个循环,我从这个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"]);
      }
   }
}
var users=api.users.GetAllUsers();
使用(DataTable=newdatatable())
{
var properties=users.users[0].GetType().GetProperties();
对于(int i=0;i
这只是一个显示问题。您的
foreach
控制台。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"]);
}
foreach(users.users中的var user)
{
DataRow newRow=table.newRow();
对于(int j=0;j
这似乎只是一个显示问题。您有一个嵌套循环,在添加新行时循环表中的所有行。这意味着您将输出所有新行。开始时,您只看到一个新创建的行。但在第二个用户处,您将再次看到第一行

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

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(users.users中的var user)
{
DataRow newRow=table.newRow();
对于(int j=0;j

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

不,您没有得到重复的语句。您需要将打印出表内容的循环移到表中插入行的循环之外。这是一个小错误。@FutureReaders小心不要认为处理无关紧要,
DataTable
是一种特殊的方法案例。这只是因为DataTable实现了接口
IComponent
,所以它是一次性的。如果您没有使用数据表上的
IComponent.Site
IComponent.Disposed
事件(如OP不是这样),则无需对其进行处理。