Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you assign values to structure elements in a List in VB.NET?

I have a user-defined structure in a list that I am trying to change the value for in an individual element within the list of structures. Accessing the element is not a problem. However, when I try to update the value, the compiler complains:

"Expression is a value and therefore cannot be the target of the assignment"

For example:

Public Structure Person

    Dim first as String
    Dim last as String
    Dim age as Integer

End Structure

_

Public Sub ListTest()

    Dim newPerson as Person

    Dim records as List (Of Person)
    records = new List (Of Person)

    person.first = "Yogi"
    person.last = "bear"
    person.age = 35

    records.Add(person)
    records(0).first = "Papa"  ' <<== Causes the error
End Sub
like image 414
Chad Harrison Avatar asked Aug 19 '11 19:08

Chad Harrison


People also ask

How do you assign values to structures?

Assign a value to a field using the setfield function. Assign a value to another field. If you specify a field that does not exist, then setfield creates it. S = struct with fields: x: [0 0.0635 0.1269 0.1904 0.2539 0.3173 0.3808 0.4443 0.5077 ... ] y: [0 0.0634 0.1266 0.1893 0.2511 0.3120 0.3717 0.4298 0.4862 ... ]

Can we assign value to variable in structure?

If the values are all in separate variables and you're not initializing the Student , then you'll probably need to assign the values individually. You can always write a function that does that for you, though, so that you have something like: setupStudent(s3, id, name, score);

How do you declare a structure in Visual Basic?

You begin a structure declaration with the Structure Statement, and you end it with the End Structure statement. Between these two statements you must declare at least one element. The elements can be of any data type, but at least one must be either a nonshared variable or a nonshared, noncustom event.

What is a list in Visual Basic?

In visual basic, List is a generic type of collection so it will allow storing only strongly typed objects i.e. elements of same data type and the size of list will vary dynamically based on our application requirements like adding or removing elements from the list.


3 Answers

As the other comments said, when you refer to records(0), you get a copy of the struct since it is a value type. What you can do (if you can't change it to a Class) is something like this:

Dim p As Person = records(0)
p.first = "Papa"
records(0) = p

Although, I think it's just easier to use a Class.

like image 119
Chris Dunaway Avatar answered Nov 02 '22 04:11

Chris Dunaway


There are actually two important concepts to remember here.

One is that, as Hans and Chris have pointed out, Structure Person declares a value type of which copies are passed between method calls.

You can still access (i.e., get and set) the members of a value type, though. After all, this works:

Dim people(0) As Person
people(0).first = "Yogi"
people(0).last = "Bear"
people(0).age = 35

So the other important point to realize is that records(0) accesses the List(Of Person) class's special Item property, which is a sugary wrapper around two method calls (a getter and setter). It is not a direct array access; if it were (i.e., if records were an array), your original code would actually have worked.

like image 41
Dan Tao Avatar answered Nov 02 '22 03:11

Dan Tao


I had the same problem, and I fixed it by adding a simple Sub to the structure that changes the value of the property.

Public Structure Person

 Dim first as String
 Dim last as String
 Dim age as Integer

 Public Sub ChangeFirst(value as String)
  me.first = value
 End Sub

End Structure
like image 34
Giorgio Acquati Avatar answered Nov 02 '22 03:11

Giorgio Acquati