我有两个数组:TempSubject()
,其中包含主题列表;和friRoutine()
,其指示何时教授主题。
我需要执行一个规则,即在特定的一天不能对任何特定的科目进行两次授课。我有一个名为DetectDuplicate(friRoutine, Tempsubject(i))
的函数,该函数用friRoutine()
检查TempSubject()
并查找friRoutine
是否已包含特定主题。如果否,则将该唯一主题添加到friRoutine
。否则,请继续循环学习下一个主题。我的代码如下所示-
Dim TempSubject() As String = {"Maths","English","Sanskrit","Sanskrit","Urdu","Urdu","Urdu","French","French","French","Physical Education","Physical Education","Game","Game", "Science"}
dim c4 as integer = 0
dim limitcounter = 0
dim friRoutine() as string
reedim friRoutine(6)
While c4 < TempSubject.Length
If DetectDuplicate(friRoutine, TempSubject(c4)) = False And limitcounter4 < 7 Then
friRoutine(limitcounter4) = TempSubject(c4)
'MessageBox.Show(c1 & ": " & limitcounter1 & ": " & tueRoutine(limitcounter1))
Debug.WriteLine("Friday: " & c4 & ": " & limitcounter4 & ": " & friRoutine(limitcounter4))
TempSubject.RemoveAt(c4)
limitcounter4 = limitcounter4 + 1
End If
c4 = c4 + 1
End While
Private Function DetectDuplicate(ByVal arr As Array, ByVal str As String) As Boolean
Dim numcount As Integer = 0
For numcount = 0 To arr.Length - 1
If arr(numcount) = str Then
Return True
End If
Next
Return False
End Function
输出应该是
friRoutine = Math, english, sanskrit, Urdu, French, Physical education, game
但不幸的是,英语不见了。 输出为:
friRoutine = Math, sanskrit, Urdu, French, Physical education, game, science
我担心使用我的代码,因为它可能在任何时间破坏整个过程。 我认为问题出在功能 DetectDuplicate()
编辑(来自评论)
我必须删除使用过的元素。我原来的课程将有42个主题,历时6天。每天7个周期。例如,如果我在星期一选了7个独特的主题,那么在接下来的6天中,我必须仅对35个主题进行调整,以适应剩下的5天。
答案 0 :(得分:4)
我要做的第一件事是将数组转换为通用列表。所以这个:
Dim TempSubject() As String = {"Maths","English","Sanskrit","Sanskrit","Urdu","Urdu","Urdu","French","French","French","Physical Education","Physical Education","Game","Game", "Science"}
Dim friRoutine() As String
成为这个:
Dim TempSubject As New List(Of String) From {"Maths","English","Sanskrit","Sanskrit","Urdu","Urdu","Urdu","French","French","French","Physical Education","Physical Education","Game","Game", "Science"}
Dim friRoutine As New List(Of String)(6)
您可以按索引访问这些列表中的项目,就像使用数组一样,但是现在 MUCH 变得更容易,例如添加或删除条目。 至少,我会为friRoutine
集合执行此操作;在此代码中使用TempSubject
的方式对数组进行了一些参数设置,但是即使在那儿,数据也可能来自某个地方,该地方会证明List(Of String)正确。
完成后,您可以极大地简化代码:
friRoutine.AddRange(TempSubject)
friRoutine = friRoutine.Distinct().Take(7).ToList()
或者,显示整个示例:
Dim TempSubject = {"Maths","English","Sanskrit","Sanskrit","Urdu","Urdu","Urdu","French","French","French","Physical Education","Physical Education","Game","Game", "Science"}
Dim friRoutine As New List(Of String)(TempSubject.Distinct().Take(7))
For i As Integer = 0 to friRoutine.Count - 1
Debug.WriteLine($"Friday: {i} : {friRoutine(i)}")
Next
现在我们看到friRoutine
的数据可以从一行代码中计算出来,一个人想知道我们是否真的需要单独的集合。
对于原始代码,最大的问题是这一行:
TempSubject.RemoveAt(c4)
这修改了集合,同时仍然循环浏览。一切都会向前移动,从而导致某些项目被跳过。
答案 1 :(得分:0)
Dim TempSubject = {"Maths","English","Sanskrit","Sanskrit","Urdu","Urdu","Urdu","French","French","French","Physical Education","Physical Education","Game","Game", "Science"}
Dim friRoutine = TempSubject.Distinct().ToArray()
如果您想要List输出,那么它就是
Dim friRoutine = TempSubject.Distinct().ToList()
由于数组和列表都是可枚举的,因此TempSubject
可以是数组或列表。