2013-06-19 2 views
0

Say У меня есть объект Рыба со свойствами, какПреобразовать строку в список пользовательских объектов

Public Property ID As Integer 
Public Property Name As String 
Public Property Type As Integer 
Public Property Age As Integer 

И у меня есть строка, которая выглядит следующим образом:

"Fishes[0].ID=1&Fishes[0].Name=Fred&Fishes[0].Type=1&Fishes[0].Age=3&Fishes[1].ID=2&Fishes[1].Name=George&Fishes[1].Type=2&Fishes[1].Age=5&..." 

Есть ли способ преобразования/кастинг/любая моя строка в список объектов Fish? Кажется, я ничего не могу найти, чтобы помочь. У меня есть некоторый контроль над форматом строки, если это упростит ситуацию.

Большое спасибо

+0

сделать метод расширения – skhurams

+0

использования Var Ls = новый список , а затем сделать расширение – skhurams

+0

@skhurams .. Почему вы не сделать ответ? – matzone

ответ

1

Что вы необходимо выполнить синтаксический анализ входной строки ok для Fishes[X].PROPNAME=VALUE образец. Прокрутите все совпадения, найденные в строке, и добавьте или установите существующий объект в словаре. Используйте X как каждый ключ объекта в словаре.

Создать структуру Рыба:

Structure Fish 
    Public ID As String 
    Public Name As String 
    Public Type As Integer 
    Public Age As Integer 
End Structure 

Коды для обработки входной строки:

Dim Fishes As New Dictionary(Of String, Fish) 
Dim m As Match = Regex.Match(str, "Fishes\[(?<key>\d+)]\.(?<prop>.+?)=(?<value>[^&]+)", RegexOptions.IgnoreCase) 

Do While m.Success 
    Dim key As String = m.Groups("key").Value.Trim.ToUpper 
    Dim prop As String = m.Groups("prop").Value.Trim.ToUpper 
    Dim value As String = m.Groups("value").Value 

    ' if the key not yet exist in the Dictionary, create and add into it. 
    If Not Fishes.ContainsKey(key) Then 
     Fishes.Add(key, New Fish) 
    End If 

    Dim thisFish As Fish = Fishes(key) ' get the Fish object for this key 

    ' determine the object property to set 
    Select Case prop 
     Case "ID" : thisFish.ID = value 
     Case "NAME" : thisFish.Name = value 
     Case "TYPE" : thisFish.Type = CInt(value) 
     Case "AGE" : thisFish.Age = CInt(value) 
    End Select 

    Fishes(key) = thisFish ' since the Fish object is declared as Structure, 
          ' update the Dictionary item of key with the modified object. 
          ' If Fish is declared as Class, then this line is useless 

    m = m.NextMatch() 
Loop 
+0

Это именно то, что я просил! Огромное спасибо! Я не уверен, что нет лучшего способа сделать это, чтобы помочь ModelBinder или что-то в этом роде, но тем временем это работает (даже если это может быть не идеально). Еще раз спасибо! – Valuk

0

Попробуйте это ..

Structure Test 
    Dim ID As String 
    Dim Name As String 
    Dim Type As Integer 
    Dim Age As Integer 
End Structure 

В вашей кнопки щелкните событие ..

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Dim Fishes As New List(Of Test) 

    Dim Fish As New Test 
    Fish.ID = "GF" 
    Fish.Name = "Gold Fish" 
    Fish.Age = 1 
    Fish.Type = 1 
    Fishes.Add(Fish) 

    MsgBox(Fishes(0).Name) 

End Sub 
+0

Привет, извините, я новичок в этом, и я не знаю действительно уверен, что я следую тому, что вы предлагаете. Моя проблема существует в середине некоторого кода, нет кнопки - метод передается строкой (см. Вопрос), а затем мне нужно построить список Fish для использования в методе. Как я могу использовать ваш ответ для этого? Спасибо – Valuk

+0

@Valuk .. вы используете winform или что? – matzone

+0

Я использую ASP.NET MVC и VB, но в момент, когда у меня есть проблема, это всего лишь случай, когда вы пытаетесь преобразовать строку в список объектов, разве это не касается VB? Извиняясь за любую путаницу, я совершенно смущен. – Valuk

0

это vb.net конвертированы

Public Partial Class test 
    Inherits System.Web.UI.Page 

    Protected Sub Page_Load(sender As Object, e As EventArgs) 


     If Not IsPostBack Then 
     End If 

    End Sub 
    Public Sub MYtest() 
     Dim ls As New List(Of Fish)() 
     Dim f As New Fish() 
     f.ID = 1 
     f.Name = "My name" 
     f.Type = "My type" 
     f.Age = 20 
     ls.Add(f) 
    End Sub 
End Class 
Public Class Fish 
    Public Property ID() As Integer 
     Get 
      Return m_ID 
     End Get 
     Set 
      m_ID = Value 
     End Set 
    End Property 
    Private m_ID As Integer 
    Public Property Name() As String 
     Get 
      Return m_Name 
     End Get 
     Set 
      m_Name = Value 
     End Set 
    End Property 
    Private m_Name As String 
    Public Property Type() As String 
     Get 
      Return m_Type 
     End Get 
     Set 
      m_Type = Value 
     End Set 
    End Property 
    Private m_Type As String 
    Public Property Age() As Integer 
     Get 
      Return m_Age 
     End Get 
     Set 
      m_Age = Value 
     End Set 
    End Property 
    Private m_Age As Integer 
End Class 
+0

Извините, я не уверен, что понимаю, как бы это использовать, чтобы преобразовать мою строку в список Fish? – Valuk

+0

см. Функция mytest – skhurams

0

В комментариях вы упомянули, что это с помощью ASP.Net MVC. ModelBinder сделает все для вас.

public ActionResult UpdateFish(IList<Fish> listOfFish) 
    { 
     //the ModelBinder will figure out that the user has posted a list of Fish instances. 
     //do something with listOfFish 
     return View(listOfFish); 
    } 
+0

Видимо (это было сделано кем-то другим) строка, с которой я работаю, была построена из модели на представлении (в javascript), а затем передана в iframe в виде строки, а затем отправлена ​​оттуда. Есть ли способ обмануть ModelBinder, который пришел из модели? Может быть, я должен восстановить модель в iframe перед публикацией _that_ назад? – Valuk

+0

Вам не нужно делать никаких обманов. ModelBinder выяснит, что пользователь опубликовал список Fish, и будет вызван метод действия. –