【问题标题】:compare two arrays and copy unique element from second to first array VB.NET比较两个数组并将唯一元素从第二个数组复制到第一个数组VB.NET
【发布时间】:2020-02-25 16:33:36
【问题描述】:

我有两个数组: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 天里,我必须在剩下的 5 天里调整 35 个科目。

【问题讨论】:

  • 我确定我们在过去几周看到了这个问题,但我在任何地方都找不到。之前问过然后删了吗?
  • 你能把作业问题贴在这里以便我们了解要求吗?

标签: arrays vb.net loops duplicates


【解决方案1】:

我要做的第一件事是将数组转换为通用列表。所以这个:

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)

您可以通过索引访问这些列表中的项目,就像使用数组一样,但是现在执行诸如添加或删除条目之类的操作变得好多了至少,我会为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)

这修改了集合,同时仍在循环中。一切都会向前移动,导致一些项目被跳过。

【讨论】:

  • 限购7件道具
【解决方案2】:

只需使用Enumerable.Distinct&lt;T&gt;()

Dim TempSubject = {"Maths","English","Sanskrit","Sanskrit","Urdu","Urdu","Urdu","French","French","French","Physical Education","Physical Education","Game","Game", "Science"}

Dim friRoutine = TempSubject.Distinct().ToArray()

如果你想要一个列表输出,那么它很简单

Dim friRoutine = TempSubject.Distinct().ToList()

由于数组和列表都是可枚举的,TempSubject 可以是数组或列表。

【讨论】:

  • @Joel Coehoorn 但我必须删除使用过的元素。我最初的课程将有 42 个科目和 6 天。每天7节。例如,如果我在星期一选了 7 个不同的科目,那么在接下来的 6 天里,我必须在剩下的 5 天里调整 35 个科目。
猜你喜欢
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 2022-11-16
  • 2022-11-12
相关资源
最近更新 更多