我有这个项目让用户从1到50输入5个不同的数字。但我想在保存到DB之前验证它,我将是5个唯一的数字。什么是最好和最快的方法?
答案 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,你就会有欺骗行为。