检测阵列vb.net 2005上重复数字的最快方法

时间:2011-09-09 17:22:11

标签: vb.net visual-studio

我有这个项目让用户从1到50输入5个不同的数字。但我想在保存到DB之前验证它,我将是5个唯一的数字。什么是最好和最快的方法?

9 个答案:

答案 0 :(得分:9)

您可以使用HashSet(Of T)来检查:

Dim numbers As IEnumerable(Of Integer) = GetInputFromUser()
Dim hash As HashSet(Of Integer) = new HashSet(Of Integer)(numbers)

Dim unique As Boolean = hash.Count = numbers.Count()

这比需要排序+迭代的选项更有效。

答案 1 :(得分:4)

检查此代码

Private Function HasDuplicates(ByVal arr As Array) As Boolean
    For i As Integer = 0 To arr.Length - 1
        If Not arr(i) Is Nothing Then
            Dim l As Integer = Array.LastIndexOf(arr, arr(i))
            If l <> i Then Return True
        End If
    Next
    Return False
End Function

答案 2 :(得分:2)

Reed Copsey建议使用哈希集是一个很好的建议(我之前没有使用过HashSet类)。

但后来我发现IEnumerable类提供了一个名为Distinct的扩展方法,它将唯一值从源IEnumerable复制到目标IEnumerable。

借用Reed的第一行示例代码,这里是新的示例VB.NET代码:

    Dim numbers As IEnumerable(Of Integer) = GetInputFromUser()
    Dim isUnique As Boolean = (numbers.Distinct.Count = numbers.Count)

如果IEnumerable数字不包含重复值,则变量isUnique为True;如果包含一个或多个重复值,则变量为False。

答案 3 :(得分:1)

放入一个数组,对其进行排序并检查元素1,2 2,3 3,4和4,5是否不同(在循环中)。

答案 4 :(得分:0)

Pseudocode:

integer numbers[50]
zeroarray(numbers, 50)

integer count = 0;
while (count < 5)
{
   integer value = getinput()

   if (value >= 1 and value <= 50)
     if (numbers[value] = 0)
     {
        count = count + 1
        numbers[value] = 1
     }
     else
        reject duplicate
   else
     reject invalid
}

答案 5 :(得分:0)

您可以尝试这种非常简单的方法: Filtering Arrays using LINQ

答案 6 :(得分:0)

为了简化,我们假设用户输入0到49之间的5个不同的数字。

您可以创建一个包含50个元素的布尔数组 IsUsed(49)

然后当用户输入值iInputNum = 30时,您可以设置IsUsed(30)= TRUE。 下次,当用户输入第二个值iInputNum = 7时,您可以设置IsUsed(7)= TRUE 通过这种方式,您可以非常快速地检查数字是否已插入。

if IsUsed(iInputNum) then
   'Skip the Input (put the right code here)
else
   'Accept the number
   IsUsed(iInputNum)=TRUE
   'save iInputNum in the database
end if

插入所有5个数字后,不要忘记清除阵列。 Remenber放置正确的索引以处理数字1-50(e不是0-49)

答案 7 :(得分:0)

这是一个替代解决方案,不确定它如何与其他解决方案进行效率比较,但似乎有效(使用LINQ)。

Dim numbers As List<int> = getListOfNumbers()
Dim allUnique As Boolean = numbers.Distinct().Count() = numbers.Count()

答案 8 :(得分:0)

聚会很晚,但这样的事情怎么样(C#,对不起)?

byte[] hits = new byte[51];
byte[] entries = new byte[] { 1, 12, 12, 32, 26, 49 };

foreach (var entry in entries)
{
    hits[entry]++;
}

hits数组中的元素会自动初始化为0. foreach循环完成后,hits将包含entries中每个数字的出现次数。如果任何大于1,你就会有欺骗行为。