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

簡単なアプローチの1つは、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

msdn

この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 に答える