2017-04-17 24 views
0

私は以下のような構造を使用しています。私は 'Persons' ArrayListをループし、LastNamesをそのまま残しながら、給与を100に設定する必要があります。VB.Net ArrayListのすべてのエントリを更新するには?

Structure Person 
    Dim LastName As String 
    Dim salary As Integer 
End Structure 

public class Test 
    public Shared Sub Main 
     Dim Persons As New ArrayList 
     Dim Person As New Person 

     With Person 
      .LastName = "Smith" 
      .salary = 50 
     End With 
     Persons.Add(Person) 

     With Person 
      .LastName = "Jones" 
      .salary = 20 
     End With 
     Persons.Add(Person) 

     With Person 
      .LastName = "Brown" 
      .salary = 80 
     End With 
     Persons.Add(Person) 

    End Sub 
End class 

単純なFor Eachループはここでは機能しません。私は、それぞれの人物を第二の一時的な編者にコピーして元のアライリストのエントリを削除することができましたが、それぞれの人の給料をどのように変更するのかを把握することはできず、彼らが元々あったような価値観。

+1

適切なプロパティを持つクラスは、ここの構造よりも適切です。同様に、型指定されていないArrayListの代わりに 'List(Of T)'のような型付きのコレクションです。その後、ループ – Plutonix

+0

@Plutonixは何を言った。 ArrayListは、C#がジェネリックを持たない日に属します。 List の方が推奨されていません。 ArrayListを使用する古いAPIとのインタフェースが必要な場合を除いて、.NET> = 2.0をターゲットとする新しいコードではArrayListを使用しないでください。 http://stackoverflow.com/a/2309699/832052 – djv

+1

[クラスと構造の選択](https://msdn.microsoft.com/en-us/library/ms229017(v=vs.110).aspx) – Plutonix

答えて

2

(暗黙的Of Object)の代わりのArrayListのList(Of Person)を使用してください。

追加を簡単にするヘルパー関数を作成してください。あなたは今、それはもう一つのポイントにPerson

Structure Person 
    Dim LastName As String 
    Dim salary As Integer 
End Structure 

Sub Main() 
    Dim Persons As New List(Of Person)() 
    AddPerson(Persons, "Smith", 50) 
    AddPerson(Persons, "Jones", 20) ' poor Jonesy 
    AddPerson(Persons, "Brown", 80) 
    For Each person In Persons 
     person.salary = 100 
    Next 

End Sub 

Public Sub AddPerson(persons As List(Of Person), lastName As String, salary As Integer) 
    persons.Add(New Person() With {.LastName = lastName, .salary = salary}) 
End Sub 

としてタイプですので、簡単にList(Of Person)を反復処理することができますあなたの元のコードはFor Eachループ

For Each p As Person In Persons 
    p.salary = 100 
Next 

が、ということですArrayListを使用することのリスクと連携

エラーなしで任意のオブジェクトを追加することができます。その後、常にPersonを追加するように訓練されていない場合は、アイテムをPersonにキャストする際に問題が発生する可能性があります。ループ端でNew Objectをencouteredまで、例えば

Persons.Add(New Object) 

For Each p As Person In Persons 
    p.salary = 100 
Next 

は繰り返しになる、その後、実行時エラーをもたらすであろう。 List(Of Person)は最初に追加されないようにするため、新しい開発には常にArrayListより優先されます。

1

この状況では、クラスがうまくいく可能性があります。また、給与のデフォルト値を100に設定して、各オブジェクトに既定値が既に設定されているようにすることもできます(後でループに割り当てる必要はありません)。

Public Class Person 
    Dim LastName As String = "" 
    Dim salary As Integer = 100 

    Public Sub New() 
     ' 
    End Sub 

    Public Sub New(ByVal Last_Name As String, ByVal Salary As Integer) 
     Me.LastName = Last_Name 
     Me.salary = Salary 
    End Sub 
End Class 
+0

実際にPlutonixが言ったことは、 '適切なプロパティを持つクラス 'です - これにはいくつかのプライベート変数があります。 – Plutonix

0

提案ループ:

For x = 0 To Persons.Count - 1 
     Dim p As Person = Persons(x) 
     p.salary = 100 
     Persons(x) = p 
    Next 

:それは永久に「人」に新しい値を書いていないとして、それ以上の検索私が行うループを見つけた後

For Each p As Person In Persons 
    p.salary = 100 
Next 

は動作しませんでした私はこれが他の誰かを助けることを望む。私はLISTアイデアを実装しました - ありがとう。

関連する問題