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

在数组vb.net 2005上检测重复数字的最快方法,vb.net,visual-studio,Vb.net,Visual Studio,我有这个项目,让用户输入5个不同的数字,从1到50。但我想在保存到DB之前验证它,我将是5个唯一的数字。做这件事最好最快的方法是什么?放入一个数组,对它进行排序,并检查元素1、2、3、4和4、5是否不同(在一个循环中)。伪代码: 整数[50] 零数组(数字,50) 整数计数=0; 同时(计数=1且值,则可以使用检查: Dim numbers As IEnumerable(Of Integer) = GetInputFromUser() Dim hash As HashSet(Of Integer

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

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

伪代码:
整数[50]
零数组(数字,50)
整数计数=0;
同时(计数<5)
{
整数值=getinput()
如果(值>=1且值,则可以使用检查:

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()
这将比需要排序+迭代的选项更有效。

检查此代码

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
私有函数将重复项(ByVal arr作为数组)作为布尔值
对于i,整数=0到阵列长度-1
如果不是,那么arr(i)什么都不是
整数形式的Dim l=数组.LastIndexOf(arr,arr(i))
如果l,则返回True
如果结束
下一个
返回错误
端函数

您可以尝试以下非常简单的方法:

简单地说,用户输入5个不同的数字,从0到49

您可以创建一个包含50个元素的布尔数组(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个数字后,不要忘记清除数组。
请记住,为了处理数字1-50(e不是0-49),请放置正确的索引。

这里有一个替代解决方案,不确定它与其他解决方案的效率比较,但它似乎有效(使用LINQ)

Dim number As List=getListofNumber()
Dim allUnique作为布尔值=数字。独特的().Count()=数字。计数()

晚会很晚了,但是像这样的事情怎么样(对不起,C#)


hits
数组中的元素自动初始化为0。当
foreach
循环完成时,
hits
将包含
条目中每个数字的出现计数。如果有大于1的,则有重复。

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;如果它包含一个或多个重复值,则变量isUnique为False。

您只想检查数字的重复或任何其他处理?该值是数组的索引,因此指示其值。无需存储值本身。数组可以d很容易成为布尔值。啊,好吧-那么,之后,你要遍历整个列表以取出所选的位?另一个简单的优化可以避免在输出到DB时扫描整个数组,就是使用另一个包含5个元素的数组并将值存储在那里,使用count作为索引。你确定吗创建数据的哈希集副本会比对5个数字进行排序和枚举更有效吗?@Michael:使用5,可能两种方式都无所谓……使用更多,是的。+1:我喜欢这个解决方案,因为它具有可扩展性……今天输入的数可能只有5个整数,但在6个月内可能会有几百个。@IAbstract:是的,总是这样我的想法。我宁愿使用一种技术来处理你扔给它的任何东西,因为像这样的代码或技术最终会被其他地方使用,或者需求发生变化等等。里德我的排序比较和基于哈希集的解决方案都更关注程序员的时间效率,而不是运行时效率,因为它们在给定的使用中可能应该这样5个输入值的大小写。这是您正在筛选的dArray的一个实例。您可以检查LINQ的语法。要知道,如果您需要在许多元素上使用它,这将不能很好地扩展,因为它是二次的。但是,对于5个项目,这很好。我认为数组用于有限数量的项目,它的工作速度比任何解决方案都快。我有三个程序在ams中,我在研究了大量关于重复的内容后使用了这个函数。是的,在我的系统上,对于不到25个项目,这比我的方法快。大约25个it开关,50个,这大约慢2倍,然后变得指数级的更糟…如果你想证明你的代码工作得快,那就去问这个提问的人。他说更好地了解哪些代码运行得快。不试图证明任何事情(我实际上运行了一个完整的测试,因为我很好奇)-正如我所说,对于5项,这比我的代码要快;)它无法很好地扩展到许多项…完美!正是我想要的,在我的整数数组上工作,所以我只需要第二行。并且也学到了一些东西。谢谢。
Dim numbers As List<int> = getListOfNumbers()
Dim allUnique As Boolean = numbers.Distinct().Count() = numbers.Count()
byte[] hits = new byte[51];
byte[] entries = new byte[] { 1, 12, 12, 32, 26, 49 };

foreach (var entry in entries)
{
    hits[entry]++;
}
    Dim numbers As IEnumerable(Of Integer) = GetInputFromUser()
    Dim isUnique As Boolean = (numbers.Distinct.Count = numbers.Count)