2014-08-29 98 views
2

我正在写循环内写入数据表的循环,但它会产生重复项。我不确定这里可能会遇到什么问题。 I“m到处重复的ID从这个API,因为这循环循环内部循环在DataTable中创建重复C#

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

不,你没有得到重复。您需要移动循环,将表格内容打印出循环外的表格中的插入行。这是一个微不足道的错误。 – Steve 2014-08-29 22:11:51

回答

4

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

这修复它,移动主循环背后的内环:

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

顺便说一句,你不需要使用using语句来为DataTableDataSet。它不使用非托管资源。 using将以其他方式阻止您进一步处理或将其从方法中返回。但是在一个例外中,通常最好的做法是使用using -statement来实现IDisposable的所有功能。

+0

@FutureReaders注意不要认为配置无关紧要,'DataTable'是一种特殊情况。这只是因为DataTable实现了“IComponent”接口,它是一次性的。如果你没有在数据表上使用IComponent.Site或者IComponent.Disposed事件(比如OP没有),那么就不需要处理它。 – 2014-08-29 23:58:51

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