8

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

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

}

我应该添加我需要在输出数字之前检查是否发生。谢谢

4

5 回答 5

15

一种简单的方法是通过 LINQ:

bool allUnique = Numbers.Distinct().Count() == Numbers.Length;
于 2012-10-25T22:01:23.100 回答
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

微软

该类HashSet<T>提供高性能的集合操作。集合是不包含重复元素且其元素没有特定顺序的集合。

于 2012-10-25T22:04:56.960 回答
1

在我看来,最简单的方法是将所有值插入到一个集合中,然后检查它的大小是否等于数组的大小。集合不能包含重复值,因此如果任何值重复,则不会将其插入集合中。

如果您没有数百万个值,这在复杂性上也是可以的,因为在集合中的插入是O(logn)及时完成的​​,因此总检查时间将为O(nlogn).

如果您想要复杂性最佳的东西,您可以O(n)通过遍历数组来及时做到这一点,并将找到的每个值放入哈希映射中,同时增加其值:如果值在集合中不存在,则将其添加为 count = 1 . 如果它确实存在,则增加它的计数。然后,您遍历哈希映射并检查所有值的计数是否为 1

于 2012-10-25T22:04:22.280 回答
1

如果你只是想确保你的列表框没有重复,那么使用这个:

if(!lbNumbers.Items.Contains(Result))    
    lbNumbers.Items.Add(Result);
于 2012-10-25T22:06:22.007 回答
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;
}
于 2016-03-18T21:04:20.423 回答