• ベストアンサー

VC#で配列の値の重複チェックについて

いつもお世話になっております。時間もなく焦っています。 ファイルの内容を全て読み込ませて、配列に値を格納しているのですが、その際行単位ではなく、配列全体でもし同じ値が既にあった場合に重複させないように格納するには、どうすればよいでしょうか? 行単位なら、参考ページなども少しはありましたが、配列となると、。 わかりにくいかもしれませんが、宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

まず第一に >配列全体でもし同じ値が既にあった場合に重複させないように格納する と考えるから、悩む事になるのです。 ここは 配列全体でもし同じ値が既にあった場合には、格納しないで捨てて、次のデータを読みにいく と考えれば良いのです。 そうすると「特定の値が配列に既存かどうか?」さえ判れば、質問者さんのやりたい事が可能になる訳です。 状況に合わせ、幾つかの方法を用います。 ・ソート済みのファイルを読み込んで、配列に格納する場合。 ソートされているので、重複行は、ファイル上で連続しています。 処理は簡単で「直前に配列に格納したのと、今ファイルから読み込んだのが同じ行なら、読んだのを捨てて読み直す」だけです。 これは「直前に配列に格納したもの=配列に既存のもの」なので、やってる事は「値が配列に既存かどうか?」を判断しているのと同義です。 ・バラバラのファイルを読み込んで、配列にはソートした状態で格納する場合。 これも処理は簡単で「事前に、元ファイルをソートした作業用ファイル」を作ってしまえば、前述のソート済みファイルの処理と同じ処理で済みます。 ・バラバラのファイルを読み込んで、配列には読み込んだ順番で格納していき、重複行だけは無視する場合。 「データが複数のファイルになってて、ファイル単位で配列に追加していく」などの場合も該当。これが一番面倒。 データの規模が小さいなら「配列の先頭から見比べる」でも構わないけど、要素数が数十万件、数百万件になった場合は「ハッシュリスト」を使うなど、工夫が必要でしょう。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • mha01
  • ベストアンサー率81% (9/11)
回答No.3

ArrayListを使ってみました。 class Program { static void Main(string[] args) { int[] intArray = { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 2, 2, 1 }; ArrayList arrayList = new ArrayList(intArray); var elements = (from element in arrayList.Cast<int>() select element).Distinct(); foreach (var element in elements) { Console.Write(element + " "); } } }

すると、全ての回答が全文表示されます。
  • mha01
  • ベストアンサー率81% (9/11)
回答No.2

Linqを使ってみました。 class Program { static void Main(string[] args) { int[] intArray = { 1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,7,7,8,8,8,9,9,10 }; var elements = (from element in intArray select element).Distinct(); foreach (var element in elements) { Console.Write(element + " "); } } }

kotikaze6
質問者

お礼

ありがとうございます。 まだC#に触れて間が無いため、Linqというものは知りませんでした。 ちなみにArrayListで格納しています。

すると、全ての回答が全文表示されます。
  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

>>ファイルの内容を全て読み込ませて、配列に値を格納しているのですが、その際行単位ではなく、配列全体でもし同じ値が既にあった場合に重複させないように格納するには、どうすればよいでしょうか? どのような処理をやろうとしているのか、質問の意味がわかりません。 推測ですが、データがもしキーでソートされているなら、直前に読み込んだデータとの重複チェックをすればOKです。 もしソートされていないなら、通常は、データのソート処理をこの処理の前に行います。 あるいは、1行読み込むごとに、配列にあるデータと同じか?をチェックして、同じなら配列に登録しないようにします。この方法だと、しだいにチェックする時間が長くなります。 どのような処理をやろうとしているのか、補足説明をお願いいたします。

kotikaze6
質問者

補足

回答ありがとうございます。補足説明を追加致します。 >>1行読み込むごとに、配列にあるデータと同じか?をチェックして、同じなら配列に登録しないようにします。 まさにこのことを実現したいのです。お願いします。

すると、全ての回答が全文表示されます。

関連するQ&A