2009-10-15 3 views
0

У меня есть процедура в VB.net с использованием VS.net 2008, которая получит список Заказов и построит файл XML со списком Заказов, как показано в приведенном ниже коде :Цитирование со списком (объектов) в vb.net

Поскольку число заказов становится огромным, я хочу, чтобы создать файл XML на каждые 500 Заявок

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 

Вместо строительство XML для всех записей, которые я хочу создать XML для каждых 500 записей. Я пробовал следующий код, и он выдает ошибку: Выражение имеет тип Заказы, которые не являются типом коллекции.

Пожалуйста, помогите

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 
+0

VS2008 или VS2005? Делает большую разницу, с точки зрения того, можно ли использовать linq. –

ответ

-1

Я хотел бы использовать что-то вроде этого:

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 
+0

В большинстве случаев запись в поток xml будет более эффективной, чем создание xml-файла в памяти и его сброс. И, как и другой ответ, это приведет к * первому * файлу, содержащему 501 заказов, а не 500. Этот код является хорошим примером того, почему For Every должно быть предпочтительным для ремонтопригодности, и в наши дни это так же эффективно, как и для .. .Следующий. Не нужно делать все это, чтобы сделать i-сервер двойным дежурством в качестве индексатора и как устройство управления потоком. – richardtallent

0

он бросает ошибку говоря Выражение Распоряжений типа, который не является типом коллекции.

переменных «Заказы» является типом коллекции (список (заказы)), но заказы (I) не является, это «Orders» (независимо от того, что есть, вы не отправили определение) объекта ,

Таким образом, вам необходимо либо реализовать IEnumerable в классе Заказы или изменить эту строку:

For Each Order In Orders(i) 
-1

Как о чем-то вроде этого:

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 

* Обратите внимание, я изменил свои заказы переменных как соглашение об именах было немного запутанным и могло вызвать конфликты имен.

+0

Это приведет к ошибке при достижении OrdersList.Count ... заставляет меня указывать на Мэтью выше vis-a-vis, используя для каждого, а не для ... Далее для читаемости. Кроме того, использование «i mod 500» означает, что ваш первый файл будет содержать 501 заказ, а не 500, из-за дополнительного «0-го» номера. Итак, если вы действительно хотите использовать i для индексирования, он должен работать от 1 ... Count, а затем использовать o = OrdersList (i-1). – richardtallent

+0

Еще одна проблема здесь я заметил ... Я не пробовал это через некоторое время (это против моего личного вкуса), но IIRC, когда вы инициализируете значение * внутри * оператора Dim в цикле, инициализатор происходит только один раз. Таким образом, в приведенном выше коде o будет установлен только один раз, и он будет продолжать писать его снова и снова. – richardtallent

+0

Извините, Брендан, это все равно не будет соответствовать спецификации. С помощью этого кода у вас будет 500 строк в первый раз (0 ... 499) и 499 для каждого дополнительного файла (500 ... 998, 999 ... 1497 и т. Д.). – richardtallent

1

Некоторые вопросы для решения:

  • Шаг 500 будет пропускать 500 строк в то время. I.e., он будет писать Order # 1, затем порядок # 501, затем # 1001 и т. Д. Вам нужно будет отслеживать ваши заказы за счет самостоятельно.
  • Ваше использование имен переменных для Order/Orders в сравнении с именами классов является путаным и отключает вас.
  • XML должен быть построен через инструменты XML в .NET, а не по строке concat. Вы быстро построитесь в кирпичную стену.

конструкция Loop:

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 
+0

Только проблема с этим кодом заключается в том, что сброс переменной i до 0 может привести к началу работы с самого начала. Лучше проверить, что i mod 500 = 0. –

+0

Спасибо, Мэтью, только что увидел, ударил лоб, исправил. Он не отправит вас назад, но это приведет к последующим файлам, имеющим 501 заказов вместо 500. Нет необходимости в mod, я использую «i» только для отслеживания файловых операций, а не для индексации списка заказов , – richardtallent

+0

Еще одна вещь, о которой нужно помнить, - попытаться использовать для/следующих циклов вместо того, чтобы/для каждого с индексированными коллекциями. Они немного быстрее. –