掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
構造体の内容の比較を行うには? (ID:141681)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
# コードを書いているうちに、Hongliang さんの回答がついていたけれども、 # 折角書いたのでそのまま投稿しておきます。 ---- 配列を含む構成の場合、クラスにすることも検討してみてください。 http://msdn.microsoft.com/ja-jp/library/ms229017.aspx > 内容が同じであるかどうかをチェックしたいのですが > 簡単に比較できる方法はありますでしょうか? 「簡単に比較」というのは、その構造体を利用する側の話でしょうか。 それとも、構造体を実装する段階での話でしょうか。 利用する側にとって簡単なのは、= 演算子を実装することでしょうか。 「If Test1 = Test2 Then」で比較できるようになりますから。 Shared Operator =(ByVal a As StrucTest, ByVal b As StrucTest) As Boolean If (a.Data1 = b.Data1) AndAlso (a.Data2 = b.Data2) AndAlso (a.Data3 = b.Data3) Then If (a.Data4 IsNot Nothing) AndAlso (b.Data4 IsNot Nothing) Then Return a.Data4.SequenceEqual(b.Data4) Else Return (a.Data4 Is Nothing) AndAlso (b.Data4 Is Nothing) End If Else Return False End If End Operator 手を抜かずに実装するのであれば、さらに IEquatable(Of T) も実装しましょう。 http://msdn.microsoft.com/ja-jp/library/ms229031.aspx http://msdn.microsoft.com/ja-jp/library/ms131187.aspx http://msdn.microsoft.com/ja-jp/library/ms131190.aspx http://dobon.net/vb/dotnet/beginner/equals.html あるいは、下記のようにシリアライザを通じて比較することもできます。 パフォーマンスの点では劣りますが、そのかわり、新たなメンバが増えても コードを変更せずに済むというメリットがあります。 (この場合、各メンバが永続化可能である必要がありますけれど) <Serializable()> _ Private Structure StrucTest Dim Data1 As String Dim Data2 As Integer Dim Data3 As Boolean Dim Data4() As String Shared Operator =(ByVal a As StrucTest, ByVal b As StrucTest) As Boolean Return BitConverter.ToString(a.ToBinary()) = BitConverter.ToString(b.ToBinary()) End Operator Shared Operator <>(ByVal a As StrucTest, ByVal b As StrucTest) As Boolean Return BitConverter.ToString(a.ToBinary()) <> BitConverter.ToString(b.ToBinary()) End Operator Private Function ToBinary() As Byte() Dim bf As New BinaryFormatter() Using stm As New MemoryStream() bf.Serialize(stm, Me) stm.Position = 0 Return New BinaryReader(stm).ReadBytes(stm.Length) End Using End Function End Structure
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.