比较两个数组并将唯一元素从第二个数组复制到第一个VB.NET

时间:2020-02-25 16:33:36

标签: arrays vb.net loops duplicates

我有两个数组: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天。

2 个答案:

答案 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)

只需使用Enumerable.Distinct<T>()

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可以是数组或列表。