C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: クラス内の値の比較


(過去ログ 139 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■81521 / inTopicNo.1)  クラス内の値の比較
  
□投稿者/ ジョバンニ (1回)-(2016/10/03(Mon) 18:44:08)

分類:[VB.NET/VB2005 以降] 

【VB2008 or VB2013】

あるクラスの実体c1, c2があるとします。
また、このクラスが持つ値が、例えば以下であるとします。
Id Integer
Name String
RefList List(Of String)

この2つのクラス実体c1, c2が持つ値が等しいかどうかを簡単に比較する方法はあるでしょうか?
両方のクラスの各値(Id・NameとRefListの件数・内容)を一つづつ比較すればいいのですが、
例えば、今後、このクラスのRefListを別のクラスのListにするようなことも考えており、
このListのクラスの値も一つづつ値を比較するのは大変だなと思い、
簡単に文字列比較のようなことができたらいいなと思い、質問しました。

よろしくお願いします。
引用返信 編集キー/
■81524 / inTopicNo.2)  Re[1]: クラス内の値の比較
□投稿者/ 魔界の仮面弁士 (923回)-(2016/10/03(Mon) 20:13:06)
No81521 (ジョバンニ さん) に返信
> この2つのクラス実体c1, c2が持つ値が等しいかどうかを簡単に比較する方法はあるでしょうか?

そのクラスに IComparer(Of ) を実装しておいては如何でしょう。
引用返信 編集キー/
■81525 / inTopicNo.3)  Re[1]: クラス内の値の比較
□投稿者/ shu (916回)-(2016/10/03(Mon) 21:40:44)
No81521 (ジョバンニ さん) に返信

別のクラスのリストにするとのことなのでRefListをList(of T)で定義するため以下のようなクラスを用意されると
よいかと思います。確認していないので完全な動作は保証しません。?.で記述された部分はあらかじめRefListの
Nothing判断をするよう組む必要があるかと思います。


Public Class Class1(Of T)
    Implements IComparable(Of Class1(Of T))

    Public Property ID As Integer
    Public Property Name As String
    Public Property RefList As List(Of T)

    Public Function CompareTo(other As Class1(Of T)) As Integer Implements IComparable(Of Class1(Of T)).CompareTo
        Dim ret = ID.CompareTo(other.ID)

        If ret = 0 Then
            ret = Name.CompareTo(other.Name)
        End If

        If ret = 0 Then
            ret = RefList?.Count.CompareTo(other.RefList?.Count)
        End If

        If ret = 0 Then
            Dim xenu = RefList.GetEnumerator
            Dim yenu = other.RefList.GetEnumerator

            Do While xenu.MoveNext AndAlso yenu.MoveNext
                Dim xitm = xenu.Current
                Dim yitm = yenu.Current

                If TypeOf xitm Is IComparable Then
                    ret = DirectCast(xitm, IComparable).CompareTo(yitm)
                Else
                    ret = xitm.ToString().CompareTo(yitm.ToString())
                End If
                If ret <> 0 Then Exit Do
            Loop
        End If

        Return ret
    End Function
End Class



クラス実装例:
Public Class Class2
    Inherits Class1(Of String)
End Class

Public Class Class3
    Inherits Class1(Of Integer)
End Class

Public Class Class4
    Public Property a As String
    Public Property b As String
    Public Overrides Function ToString() As String
        Return String.Format("{a}{b}")
    End Function
End Class

Public Class Class5
    Inherits Class1(Of Class4)
End Class


引用返信 編集キー/
■81526 / inTopicNo.4)  Re[1]: クラス内の値の比較
□投稿者/ PANG2 (154回)-(2016/10/04(Tue) 09:17:13)
2016/10/04(Tue) 09:24:50 編集(投稿者)

No81521 (ジョバンニ さん) に返信
> この2つのクラス実体c1, c2が持つ値が等しいかどうかを簡単に比較する方法はあるでしょうか?

バイナリシリアライズして比較するとか。

http://d.hatena.ne.jp/tekk/20091012/1255357237
http://hakuwan.exblog.jp/12768536
引用返信 編集キー/
■81543 / inTopicNo.5)  Re[2]: クラス内の値の比較
□投稿者/ ジョバンニ (2回)-(2016/10/06(Thu) 10:35:02)
皆さま、アドバイスありがとうございます。ジョバンニです。

本来は魔界の仮面弁士様やshu様のような対応が必要なのだと思いますが、
今回の目的は、いわば手抜き比較という邪道なものであるため、
PANG2様のご提案を試してたいと思います。

改めて結果をご報告しますが、誠に勝手ながら、別の予定が入ってしまい、
本件レスポンスが遅くなってしまうこと、何卒お許しください。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -