在vb.net中使用列表(对象)循环

在vb.net中使用列表(对象)循环,vb.net,Vb.net,我在VB.net中有一个使用VS.net 2008的过程,该过程将获取订单列表,并使用订单列表构建一个XML文件,如下代码所示: 由于订单数量越来越大,我想为每500个订单构建一个XML文件 Dim Orders as List(of Orders)=DAL.GetAllOrders() Dim Order as new Orders Public xmlstring As New StringBuilder If Not Orders Is Nothing Then xmlstring.

我在VB.net中有一个使用VS.net 2008的过程,该过程将获取订单列表,并使用订单列表构建一个XML文件,如下代码所示:

由于订单数量越来越大,我想为每500个订单构建一个XML文件

Dim Orders as List(of Orders)=DAL.GetAllOrders()
Dim Order as new Orders

Public xmlstring As New StringBuilder

If Not Orders Is Nothing Then

xmlstring.Append("<?xml version=""1.0"" encoding=""Windows-1252"" standalone=""yes""?>")
                    xmlstring.Append("<Orders>")

For Each Order In Orders

    'Build the XML File

next

     'access web service and pass the XML file

end if
Dim Orders as List(of Orders)=DAL.GetAllOrders()
暗订单作为新订单
公共xmlstring作为新的StringBuilder
如果不是命令,那就什么都不是了
xmlstring.Append(“”)
xmlstring.Append(“”)
对于订单中的每个订单
'生成XML文件
下一个
'访问web服务并传递XML文件
如果结束
我希望为每500条记录创建XML,而不是为所有记录构建XML。 我尝试了下面的代码,它抛出了一个错误 表达式的类型为Orders,它不是集合类型

请帮忙

Dim start As Integer
  For i As Integer = start To Orders.Count Step 500
    xmlstring.Append("<?xml version=""1.0"" encoding=""Windows-1252"" standalone=""yes""?>")
                    xmlstring.Append("<Orders>")

    For Each Order In Orders(i)

    'Build the XML File

    next                 

  next
Dim起始值为整数
对于i作为整数=开始计算订单。计算步骤500
xmlstring.Append(“”)
xmlstring.Append(“”)
订单中的每个订单(i)
'生成XML文件
下一个
下一个
它抛出一个错误,表示表达式的类型为Orders,而不是集合类型

变量“Orders”是一个集合类型(List(of Orders)),但Orders(i)不是,它是一个“Orders”(不管是什么,您还没有发布定义)对象

因此,您需要在Orders类中实现IEnumerable或更改此行:

For Each Order In Orders(i)

像这样的怎么样:

Dim OrdersList as List(of Orders)=DAL.GetAllOrders()


For i as int32 = 0 to OrdersList.Count() - 1
  Dim o as Orders = OrdersList(i)
  'Build your xml
  If i mod 500 = 0 Then
    'write out xml & reset your string builder
  End If

Next
for i as integer = 0 to orders.count - 1
  <create xml here and put into variable (append new XML as needed)>
  if (i mod 500 = 0 andalso not i = 0) orelse i = orders.count - 1 then
    <output XML here and clear XML variable>
  end if
next i

*注意:我更改了Orders变量,因为命名约定有点混乱,可能会导致名称冲突。

我将使用以下内容:

Dim OrdersList as List(of Orders)=DAL.GetAllOrders()


For i as int32 = 0 to OrdersList.Count() - 1
  Dim o as Orders = OrdersList(i)
  'Build your xml
  If i mod 500 = 0 Then
    'write out xml & reset your string builder
  End If

Next
for i as integer = 0 to orders.count - 1
  <create xml here and put into variable (append new XML as needed)>
  if (i mod 500 = 0 andalso not i = 0) orelse i = orders.count - 1 then
    <output XML here and clear XML variable>
  end if
next i
i作为整数=0到orders.count-1的

如果(i mod 500=0,也不是i=0)或i=orders.count-1,则
如果结束
接下来我

需要解决的一些问题:

  • 步骤500将一次跳过500行。也就是说,它将写入订单#1,然后是订单#501,然后是订单#1001,等等。您需要自己跟踪每次盘点的订单
  • 您对订单/订单使用变量名与使用类名比较容易混淆,并且会让您感到困惑
  • XML应该通过.NET中的XML工具构建,而不是通过字符串concat。你很快就会把自己变成一堵砖墙
循环构造:

 Dim Orders as List(of Order) = DAL.GetAllOrders()
 If Not Orders Is Nothing Then
   Dim i As Integer = 1
   For Each order As Order In Orders
     If i=500 Then
        ' write XML footers, close the current file
        ' open the next file, write XML header
        i = 1
     Else
        i += 1
     End If
     ' write XML for this order
   Next
   ' Write final XML footer and close current file
 End If

vs2008还是vs2005?就是否可以使用linq而言,这有很大的区别。此代码的唯一问题是,将i变量重置为0可能会导致重新开始。最好检查i mod 500=0。谢谢Matthew,刚刚看到,拍了拍额头,修复了。它不会将您发送回开始,但会导致后续文件中有501个订单,而不是500个订单。不需要mod,我只使用“I”来跟踪文件操作,而不是索引订单列表。另一件需要记住的事情是尝试使用for/next循环,而不是使用for/each来索引集合。它们的速度要快得多。Foreach/For Each的速度与.NET更高版本中的…Next一样快,而且更易于维护。目前大多数商店的最佳实践是使用doreach,如果存在微小的性能差异,在大多数情况下不值得挤出。这将在到达OrdersList.Count时出错。。。为了可读性,我向Matthew指出了上面的vis-a-vis使用For Each而不是For…Next。此外,使用“i mod 500”意味着您的第一个文件将包含501个订单,而不是500个订单,因为额外的“0”号。所以,如果你真的想用i来编制索引,它应该从1…Count开始运行,然后使用o=OrdersList(i-1)。。。我已经有一段时间没有尝试过了(这违背了我个人的口味),但是IIRC,当在循环中初始化Dim语句中的值时,初始化器只发生一次。因此,在上面的代码中,o只会被设置一次,它会一遍又一遍地写出来。抱歉,brendan,这仍然不符合规范。使用此代码,您第一次将有500行(0…499),并且每增加一个文件(500…998,999…1497等)将有499行。在大多数情况下,写入xml流将比在内存中构建xml文件并转储它更有效。和另一个答案一样,这将导致第一个文件包含501个订单,而不是500个订单。这段代码是一个很好的例子,说明了为什么在可维护性方面应该优先使用For-Each,而且它现在的性能和…Next一样好。不需要为了使i服务器兼作索引器和流控制设备而做所有这些。