DOBON.NET DOBON.NETプログラミング掲示板過去ログ

構造体でのIndexOfの使用

環境/言語:[VB.NET2005]
分類:[.NET]

VB6からの移行ユーザで、ArrayクラスのIndexOfが大変便利で使用しています。
通常の1次元変数では問題ないのですが、下記の例のように「構造体」の1次元
変数の場合はIndexOfは使用出来ないのでしょうか??

Public Class Form1
Structure StrValue
Dim No As Integer
Dim Name As String
End Structure
Dim Worker() As StrValue

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim _No() As Integer = {100, 110, 120}
Dim _Name() As String = {"A", "B", "C"}

ReDim Worker(_No.Length - 1)
For i As Integer = 0 To _No.Length - 1
With Worker(i)
.No = _No(i)
.Name = _Name(i)
End With
Next
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim TargetName As String = "B"
'名前をキーで検索して変数のいんでっくす
Dim Index As Integer = Array.IndexOf(Worker.no, TargetName)
If Index > -1 Then
MsgBox(TargetName & "さんの番号は" & Worker(Index).No.ToString & "です")
Else
MsgBox(TargetName & "さんは見つかりませんでした")
End If
End Sub
End Class

宜しくご教授のほどお願いいたします。
Array.IndexOf() は "配列".IndexOf() ということです。
何が配列なのかを考えましょう。

> Structure StrValue
> Dim No As Integer
> Dim Name As String
> End Structure
> Dim Worker() As StrValue

↑ 構造体の配列

> Dim _No() As Integer = {100, 110, 120}

↑ 整数の配列

つまり、Noを特定しようとするとそれぞれは、Worker(index).No 、_No(index) になりますよね。
まどかさん、早速のレス、有り難うございます。

■No21061に返信(まどかさんの記事)
> Array.IndexOf() は "配列".IndexOf() ということです。
> 何が配列なのかを考えましょう。
> つまり、Noを特定しようとするとそれぞれは、Worker(index).No 、_No(index) になりますよね。

「Dim Index As Integer = Array.IndexOf(Worker.no, TargetName)」の部分の事でしょうか?
これは「こんな感じで・・・」ってだけで、この部分(特に「Array.IndexOf(Worker.no,」)が分からないのです。
IndexOfの第一引数はArrayなのですが、構造体Arrayですので「Array.IndexOf(Worker().No, TargetName)」と
言うわけにも行かないようです。
すいませんが、もう少しご教授いただけませんでしょうか??
「何が配列なのか」と書きました。
つまり何の集まりなのか。

Dim _No() As Integer

これは、整数(Integer)の集まりです。

Dim Worker() As StrValue

これは、構造体(StrValue)の集まりです。

そして、
Structure StrValue
Dim No As Integer
Dim Name As String
End Structure
この中のNoは「構造体のメンバ」です。
要はNoやNameが配列であるわけではありません。

Public Structure Person
Public Name As String
Public Age As Integer
End Structure
Dim Persons() As Person

Personは人間を表します。
Persons()は人間の集まりを表します。
NameとAgeは人間の属性です。NameとAgeが集まっているわけではありません。
「xxxさんの名前」とは
xxxさん → Persons(n)
xxxさんの名前 → Persons(n).Name
になります。

配列の要素を特定する(IndexOf)ことは、「xxxの集まり」の中から「xxx」を探すということになります。
つまり、StrValueやPersonを特定するということになります。

それを踏まえると

Array.IndexOf(Worker.no, TargetName)

これには2つの誤りがあります。
・Worker.Noは配列ではないこと
・TargetNameは配列の要素ではないこと

つまり、「xxxの集まり」の中から「xxx」という表現になっていないということです。

私が正解を出すのは簡単なので、上記を理解して一旦頑張ってみてください。
■No21064に返信(まどかさんの記事)
> Array.IndexOf(Worker.no, TargetName)
> これには2つの誤りがあります。
> ・TargetNameは配列の要素ではないこと
これはミスタイプですね。(^^;)
Array.IndexOf(Worker.name, TargetName)ですね。

> ・Worker.Noは配列ではないこと
って事はできないってことですね。
どうもありがとうございました。
解決済み!
> って事はできないってことですね。

できないわけではありません。

私は、「つまり、「xxxの集まり」の中から「xxx」という表現になっていないということです。」と書きました。
あなたは構造体配列の中から構造体を探すのではなく、ある特定の値を含む構造体を探そうとしています。
この場合、IndexOfが目的を達成するためのメソッドではないということになり
また、それに気付いてほしかったのですが。

次の中の2つを比べてみてください。

Private Structure Person
Public Name As String
Public Age As Integer
Public Sub New(ByVal name As String, ByVal age As Integer)
Me.Name = name
Me.Age = age
End Sub
End Structure

Private Sub Sample()

Dim personsArray(2) As Person

personsArray(0) = New Person("John", 23)
personsArray(1) = New Person("Taro", 37)
personsArray(2) = New Person("Kim", 58)

Dim targetPerson As New Person("Taro", 37)

MessageBox.Show(Array.IndexOf(personsArray, targetPerson).ToString)

Dim targetName As String = "Taro"
Dim targetIndex As Integer = -1

For index As Integer = 0 To personsArray.GetUpperBound(0)
If personsArray(index).Name = targetName Then
targetIndex = index
Exit For
End If
Next

MessageBox.Show(targetIndex.ToString)

End Sub

DOBON.NET | プログラミング道 | プログラミング掲示板