抱歉新手问题。有人可以帮帮我吗?这里有简单的数组检查所有用户输入的最佳/最简单方法是唯一且不重复的?感谢
private void btnNext_Click(object sender, EventArgs e)
{
string[] Numbers = new string[5];
Numbers[0] = txtNumber1.Text;
Numbers[1] = txtNumber2.Text;
Numbers[2] = txtNumber3.Text;
Numbers[3] = txtNumber4.Text;
Numbers[4] = txtNumber5.Text;
foreach (string Result in Numbers)
{
lbNumbers.Items.Add(Result);
}
txtNumber1.Clear();
txtNumber2.Clear();
txtNumber3.Clear();
txtNumber4.Clear();
txtNumber5.Clear();
}
}
}
我应该补充一下,我需要在输出数字之前检查一下。感谢
答案 0 :(得分:15)
一种简单的方法是通过LINQ:
bool allUnique = Numbers.Distinct().Count() == Numbers.Length;
答案 1 :(得分:2)
另一种方法是使用HashSet<string>
:
var set = new HashSet<string>(Numbers);
if (set.Count == Numbers.Count)
{
// all unique
}
或Enumerable.All
:
var set = new HashSet<string>();
// HashSet.Add returns a bool if the item was added because it was unique
bool allUnique = Numbers.All(text=> set.Add(text));
Enunmerable.All
在序列非常大时效率更高,因为它不会完全创建集合,而是一个接一个地创建集合,并且一旦检测到重复就会返回false
。
以下是此效果的演示:http://ideone.com/G48CYv
HashSet
构造函数内存消耗:50 MB,持续时间:00:00:00.2962615 Enumerable.All
内存消耗:0 MB,持续时间:00:00:00.0004254 MSDN
HashSet<T>
类提供高性能的集合操作。 集合是一个不包含重复元素的集合,其集合 元素没有特别的顺序。
答案 2 :(得分:1)
在我看来,最简单的方法是在集合中插入所有值,然后检查其大小是否等于数组的大小。集合不能包含重复值,因此如果任何值重复,则不会将其插入集合中。
如果您没有数百万的值,这也很复杂,因为在O(logn)
时间内插入集合,因此总检查时间将为O(nlogn)
。
如果你想要一些复杂度最优的东西,你可以在O(n)
时间通过遍历数组来执行此操作,并且将找到的每个值放入哈希映射,同时增加其值:if如果值不存在于set中,则使用count = 1添加它。如果它确实存在,则增加其计数。
然后,您浏览哈希映射并检查所有值是否为1 。
答案 3 :(得分:1)
如果您只是想确保列表框没有重复内容,请使用以下命令:
if(!lbNumbers.Items.Contains(Result))
lbNumbers.Items.Add(Result);
答案 4 :(得分:0)
这个怎么样:
public bool arrayContainsDuplicates(string[] array) {
for (int i = 0; i < array.Length - 2; i++) {
for (int j = i + 1; j < array.Length - 1; j++) {
if (array[i] == array[j]) return true;
}
}
return false;
}