如何检查此阵列中的重复答案? C#

时间:2012-10-25 21:59:45

标签: c# arrays duplicates

抱歉新手问题。有人可以帮帮我吗?这里有简单的数组检查所有用户输入的最佳/最简单方法是唯一且不重复的?感谢

    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();
    }
}

}

我应该补充一下,我需要在输出数字之前检查一下。感谢

5 个答案:

答案 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;
}