.net 同时引用多个列表中的元素

.net 同时引用多个列表中的元素,.net,vb.net,list,inheritance,combinatorics,.net,Vb.net,List,Inheritance,Combinatorics,在我的第一篇文章中,我有一个棘手的问题 我已经读完了教程,但还不足以加入开源社区 多亏了这一点,我正试图创建一个程序,跟踪炼金术游戏中使用的组合(通常在手机上等) 我有以下课程 类游戏包含元素和组合的属性 类元素继承(元素的)列表 类组合继承列表(组合的) 类元素 阶级组合 组合包含元素1和元素2以及结果的列表(元素) 我的问题: 使用Game.Elements如何为该元素的组合添加只读属性。 i、 e 假设元素 火 土 水 空气 精力 而且组合也有 火+地=能量 地+气=泥 我想要

在我的第一篇文章中,我有一个棘手的问题

我已经读完了教程,但还不足以加入开源社区

多亏了这一点,我正试图创建一个程序,跟踪炼金术游戏中使用的组合(通常在手机上等)

我有以下课程

  • 类游戏包含元素和组合的属性
  • 类元素继承(元素的)列表
  • 类组合继承列表(组合的)
  • 类元素
  • 阶级组合
组合包含元素1和元素2以及结果的列表(元素)

我的问题: 使用Game.Elements如何为该元素的组合添加只读属性。 i、 e

假设元素

  • 空气
  • 精力
而且组合也有

  • 火+地=能量
  • 地+气=泥
我想要

Game.Elements(“能量”)。组合返回包含1个匹配项的组合

  • 火+地=能量
到目前为止,我似乎无法通过游戏类访问这些组合

我非常愿意接受任何建议或建议

到目前为止,我的完整代码是

Option Explicit On


'TODO: Add classes for Combinations
'TODO: Edit Elements class for Various filters (Filter by Category, Generation etc)

Public Class Game

    Private pElements As Elements
    Private pOptions As Options


    Public Property Options() As Options
        Get
            Return pOptions
        End Get
        Set(ByVal value As Options)
            pOptions = value
        End Set
    End Property

    Public Property Elements() As Elements
        Get
            Return pElements
        End Get
        Set(ByVal value As Elements)
            pElements = value
        End Set
    End Property

    Public Sub New()
        Me.Elements = New Elements()
        Me.Options = New Options()
    End Sub

    Public Sub New(ByVal TotalElements As Long, _
                   Optional ByVal TotalCategories As Long = 1, _
                   Optional ByVal Categories As Boolean = False, _
                   Optional ByVal Terminated As Boolean = False, _
                   Optional ByVal SelfCombination As Boolean = True, _
                   Optional ByVal ReverseCombination As Boolean = False)
        Me.Elements = New Elements()
        Me.Options = New Options(TotalElements, _
                                 TotalCategories, _
                                 Categories, _
                                 Terminated, _
                                 SelfCombination, _
                                 ReverseCombination)
    End Sub


End Class

#Region "Combinations"

Public Class Combinations
    Inherits List(Of Combination)
    Implements IEnumerable(Of Combination)

End Class

Public Class Combination

    Private pElements As List(Of Element)
    Private pResult As List(Of Element)


    Public Property Elements() As List(Of Element)
        Get
            Return pElements
        End Get
        Set(ByVal value As List(Of Element))
            pElements = value
        End Set
    End Property

    Public Property Result() As List(Of Element)
        Get
            Return pResult
        End Get
        Set(ByVal value As List(Of Element))
            pResult = value
        End Set
    End Property


End Class

#End Region

#Region "Elements"

Public Class Elements
    Inherits List(Of Element)
    Implements System.Collections.Generic.IComparer(Of Element)
    Implements IEnumerable(Of Element)


    Public Function Compare(ByVal e1 As Element, ByVal e2 As Element) As Integer Implements IComparer(Of Element).Compare
#If CONFIG = "Debug" Then
        Debug.WriteLine("{0} - {1}", e1.Name, e2.Name)
#End If
        Select Case e1.Generation
            Case Is = e2.Generation
                Select Case e1.Category.Name
                    Case Is = e2.Category.Name
                        Select Case e1.Name
                            Case Is = e2.Name
                                Return 0
                            Case Is > e2.Name
                                Return 1
                            Case Else '< e2.Name
                                Return -1
                        End Select
                    Case Is > e2.Category.Name
                        Return 1
                    Case Else '< e2.Category
                        Return -1
                End Select
            Case Is > e2.Generation
                Return 1
            Case Else '< e2.Generation
                Return -1
        End Select
    End Function

    Default Public Overloads ReadOnly Property Item(ByVal Name As String) As Element
        Get
            Return Me.Where(Function(k As Element) k.Name = Name).ElementAt(0)
        End Get
    End Property


End Class

Public Class Element
    Implements System.IComparable(Of Element)




    Public Name As String
    Public Category As Category
    Public Generation As Integer
    Public Terminal As Boolean

    Public Sub New()
        With Me
            .Name = "Blank"
            .Category = New Category()
            .Generation = 0
            .Terminal = False
        End With
    End Sub

    Public Sub New(ByVal Name As String, Optional ByVal Category As String = "N/A", Optional ByVal Generation As Long = 0, Optional ByVal Terminal As Boolean = False)
        With Me
            .Name = Name
            .Category = New Category(Category)
            .Generation = Generation
            .Terminal = Terminal
        End With
    End Sub

    Public Shared Operator =(ByVal e1 As Element, ByVal e2 As Element) As Boolean
        Return (e1.Category.Name = e2.Category.Name And _
               e1.Name = e2.Name And _
               e1.Generation = e2.Generation And _
               e1.Terminal = e2.Terminal)
    End Operator
    Public Shared Operator <>(ByVal e1 As Element, ByVal e2 As Element) As Boolean
        Return Not e1 = e2
    End Operator
    Public Shared Operator >(ByVal e1 As Element, ByVal e2 As Element) As Boolean
        'Generation
        'Category
        'Name
        Select Case e1.Generation
            Case Is = e2.Generation
                Select Case e1.Category.Name
                    Case Is = e2.Category.Name
                        Select Case e1.Name
                            Case Is = e2.Name
                                Return False
                            Case Is > e2.Name
                                Return True
                            Case Else '< e2.Name
                                Return False
                        End Select
                    Case Is > e2.Category.Name
                        Return True
                    Case Else '< e2.Category
                        Return False
                End Select
            Case Is > e2.Generation
                Return True
            Case Else '< e2.Generation
                Return False
        End Select
    End Operator
    Public Shared Operator <(ByVal e1 As Element, ByVal e2 As Element) As Boolean
        Return Not (e1 >= e2)
    End Operator
    Public Shared Operator >=(ByVal e1 As Element, ByVal e2 As Element) As Boolean
        Return (e1 = e2 OrElse e1 > e2)
    End Operator
    Public Shared Operator <=(ByVal e1 As Element, ByVal e2 As Element) As Boolean
        Return (e1 = e2 OrElse e1 < e2)
    End Operator

    Public Function CompareTo(ByVal e1 As Element) As Integer Implements IComparable(Of Element).CompareTo
        Select Case Me.Generation
            Case Is = e1.Generation
                Select Case Me.Category.Name
                    Case Is = e1.Category.Name
                        Select Case Me.Name
                            Case Is = e1.Name
                                Return 0
                            Case Is > e1.Name
                                Return 1
                            Case Else '< e2.Name
                                Return -1
                        End Select
                    Case Is > e1.Category.Name
                        Return 1
                    Case Else '< e2.Category
                        Return -1
                End Select
            Case Is > e1.Generation
                Return 1
            Case Else '< e2.Generation
                Return -1
        End Select
    End Function
    Public Overrides Function ToString() As String
        With Me
            Return .WL("{0} - {1} - {2} - {3}", .Name, .Category.Name, .Generation, Terminal)
        End With
    End Function
    Private Function WL(ByVal value As String, ByVal ParamArray args As String()) As String
        For i = LBound(args) To UBound(args)
            value = value.Replace("{" & i & "}", args(i))
        Next
        Return value
    End Function
End Class

Public Class ElementComparer
    Implements System.Collections.Generic.IComparer(Of Element)
    Public Function Compare(ByVal e1 As Element, ByVal e2 As Element) As Integer Implements IComparer(Of Alchemy.Element).Compare

        Select Case e1.Generation
            Case Is = e2.Generation
                Select Case e1.Category.Name
                    Case Is = e2.Category.Name
                        Select Case e1.Name
                            Case Is = e2.Name
                                Return 0
                            Case Is > e2.Name
                                Return 1
                            Case Else '< e2.Name
                                Return -1
                        End Select
                    Case Is > e2.Category.Name
                        Return 1
                    Case Else '< e2.Category
                        Return -1
                End Select
            Case Is > e2.Generation
                Return 1
            Case Else '< e2.Generation
                Return -1
        End Select
    End Function
End Class

#End Region

Public Class Options

#Region "Properties"
    Private pAllowCategories As Boolean
    Private pAllowTerminatedElements As Boolean
    Private pAllowSelfCombination As Boolean
    Private pAllowReverseCombination As Boolean
    Private pTotalElements As Long
    Private pTotalCategories As Long
#End Region

#Region "Property Set"
    Public Property AllowCategories() As Boolean
        Get
            Return pAllowCategories
        End Get
        Set(ByVal value As Boolean)
            pAllowCategories = value
        End Set
    End Property
    Public Property AllowTerminatedElements() As Boolean
        Get
            Return pAllowTerminatedElements
        End Get
        Set(ByVal value As Boolean)
            pAllowTerminatedElements = value
        End Set
    End Property
    Public Property AllowSelfCombination() As Boolean
        Get
            Return pAllowSelfCombination
        End Get
        Set(ByVal value As Boolean)
            pAllowSelfCombination = value
        End Set
    End Property
    Public Property AllowReverseCombination() As Boolean
        Get
            Return pAllowReverseCombination
        End Get
        Set(ByVal value As Boolean)
            pAllowReverseCombination = value
        End Set
    End Property
    Public Property TotalElements() As Long
        Get
            Return pTotalElements
        End Get
        Set(ByVal value As Long)
            pTotalElements = value
        End Set
    End Property
    Public Property TotalCategories() As Long
        Get
            Return pTotalCategories
        End Get
        Set(ByVal value As Long)
            pTotalCategories = value
        End Set
    End Property
#End Region

#Region "Methods"
    Public Sub New(ByVal TotalElements As Long, _
                   Optional ByVal TotalCategories As Long = 1, _
                   Optional ByVal Categories As Boolean = False, _
                   Optional ByVal Terminated As Boolean = False, _
                   Optional ByVal SelfCombination As Boolean = True, _
                   Optional ByVal ReverseCombination As Boolean = False)
        With Me
            .TotalCategories = TotalCategories
            .TotalElements = TotalElements
            .AllowCategories = Categories
            .AllowTerminatedElements = Terminated
            .AllowSelfCombination = SelfCombination
            .AllowReverseCombination = ReverseCombination
        End With
    End Sub

    Public Sub New()
        With Me
            .TotalCategories = 1
            .TotalElements = 1
            .AllowCategories = False
            .AllowTerminatedElements = False
            .AllowSelfCombination = True
            .AllowReverseCombination = False
        End With
    End Sub

#End Region

End Class

Public Class Category

    Private pName As String
    Private pID As UInteger

    Public Property Name() As String
        Get
            Return pName
        End Get
        Set(ByVal value As String)
            pName = value
        End Set
    End Property

    Public Property ID() As UInteger
        Get
            Return pID
        End Get
        Set(ByVal value As UInteger)
            pID = value
        End Set
    End Property

    Public Sub New()
        Me.Name = "N/A"
        Me.ID = 0
    End Sub

    Public Sub New(ByVal Name As String, Optional ByVal ID As UInteger = 0)
        Me.Name = Name
        Me.ID = ID
    End Sub
End Class
选项显式打开
'TODO:为组合添加类
'TODO:编辑各种过滤器的元素类(按类别、生成等进行过滤)
公开课游戏
作为要素的私人物品
作为选项的私有pOptions
公共属性选项()作为选项
收到
回音
结束
设置(ByVal值作为选项)
pOptions=值
端集
端属性
公共属性元素()作为元素
收到
返回毛皮
结束
设置(作为元素的ByVal值)
pElements=值
端集
端属性
公共分新()
Me.Elements=新元素()
Me.Options=新选项()
端接头
公共子新建(ByVal TotalElements,长度为_
可选ByVal TotalCategories,长度=1_
可选的ByVal类别为Boolean=False_
可选的ByVal终止为Boolean=False_
可选的ByVal自组合,布尔值=True_
可选的ByVal反向组合为布尔值=False)
Me.Elements=新元素()
Me.Options=新选项(TotalElements_
总体类别_
类别_
终止_
自结合_
反向组合)
端接头
末级
#区域“组合”
公共类组合
继承列表(组合的)
(指组合)可数的
末级
公共类组合
作为(元素)列表的专用元素
私有预设为列表(元素的)
公共属性元素()作为(元素的)列表
收到
返回毛皮
结束
设置(ByVal值作为列表(元素))
pElements=值
端集
端属性
公共属性结果()作为(元素的)列表
收到
返回预设
结束
设置(ByVal值作为列表(元素))
pResult=值
端集
端属性
末级
#末端区域
#区域“要素”
公共类要素
继承(元素的)列表
实现System.Collections.Generic.IComparer(元素的)
实现(元素的)IEnumerable
公共函数Compare(ByVal e1作为元素,ByVal e2作为元素)作为整数实现IComparer(Of元素)。Compare
#如果CONFIG=“Debug”,则
Debug.WriteLine(“{0}-{1}”,e1.Name,e2.Name)
#如果结束
选择案例e1。生成
Case Is=e2.Generation
选择Case e1.Category.Name
Case Is=e2.Category.Name
选择案例e1。名称
Case Is=e2.Name
返回0
Case>e2.Name
返回1
Case Else'e2.Category.Name
返回1
案例Else'e2.Generation
返回1
Case Else'Public Class cGame
    Public Elements as cElements
    Public Sub New()
        cElements.Parent = Me
    End Sub
End Class
Public Class cElements
    Protected Friend Shared Parent As cGame
End Class
Public Class cCombinations
    Protected Friend Shared Parent As cGame
End Class
MyGame.Elements.Parent
MyGame.Elements.Parent.Combinations