配列のインデックスは存在しますか


89

私は仕事で本当に悪臭のあるコードをいくつか受け継いでいます。私は可能な限り最も痛みのない解決策を見つけることを望んでいます。

任意の数が配列の有効な要素であるかどうかを確認する方法はありますか?

例-array [25]が存在するかどうかを確認する必要があります。

できれば、配列を介してforeach()を実行せずにこれを実行して、行を検索することをお勧めします。

これを行う方法はありますか、それともforeachループで立ち往生していますか?


array [x] == 25の値があるかどうかを知りたいということですか?array [25]が存在するかどうかを尋ねることで、あなたが求めているものについて人々を混乱させていると思います。確かに配列に26個以上の要素があれば存在しますが、それはあなたが求めているものではないと思います。
kevin42 2009

私が作業しているプログラムには、同じファイル名を持つ2つの可能な配列があります。1つには21の要素があり、もう1つには30の要素があります。array [25]に値が存在する場合は、その値が必要です。
splatto 2009

回答:


144

長さをテストする

int index = 25;
if(index < array.Length)
{
    //it exists
}

3
ありがとう。.Lengthプロパティについて考えていなかったなんて信じられません!
splatto 2009

13
インデックス> = 0であることも確認してください。
Andreas Grech 2015年

2
そして、配列自体がnullでないことを確認してください:)
Shimmy Weitzhandler 2017年

1
C#では配列インデックスがシーケンシャルである必要があるため、これは当てはまります。シーケンシャルインデックスを持たないコレクションタイプがありますが、それらはC#の基本的な配列タイプではありません。
reor 2017

99

LINQを使用してそれを実現することもできます。

var exists = array.ElementAtOrDefault(index) != null;

4
おかげで、これは不器用な配列の長さのチェックの代わりに私が探していたものです。
スターシーカー2016

6
マイナーノート、0の要素。なのでnew object[]{ null }.ElementAtOrDefault(index)戻ります。を使用することは、配列インデックスが存在することを確認するための優れたソリューションではありません。最後に等しいチェックを追加すると、結果が不確定になります。null nullElementAtOrDefault
Chris Marisic 2017年

@ChrisMarisic例を挙げていただけますか?
FMFF 2017年

2
@ChrisMarisicあなたが正しいです、あなたが存在をチェックしたい場合に備えて、そうするだけですarray.Length > index
シミーワイツハンドラー2017年

2
@ChrisMarisic、実際にはこれは重要な注意事項です。このような解決策は隠れたバグにつながります
amd 2018

21

「有効な要素である」とはどういう意味ですか?あなたはただすることができます:

if (array.Length >= 26)

これにより、25が配列への有効なインデックスであるかどうかがわかります(下限が0であると想定)。

nullでないかどうかを知る必要がある場合は、次を使用してください。

if (array[25] != null)

(または2つの組み合わせ)。

これらが役に立たない場合は、問題に対して「有効」のより正確な意味を教えてください。


3
2番目の例ではこれを手に入れました。Index was outside the bounds of the array
Muhammad Raheel 2015

4
@raheel:では、代わりに最初のテストを使用する必要があったようです...
Jon Skeet

11

アイテムがnullでないかどうかも確認したいとします

if (array.Length > 25 && array[25] != null)
{
    //it exists
}

1
注:ガットを使用する&&にはif (array.Length > 25 && array[25] != null)、使用のシングルがあれば、&IndexOutOfRange例外がスローされます。MSDN
チェックサム

3
// I'd modify this slightly to be more resilient to a bad parameter
// it will handle your case and better handle other cases given to it:

int index = 25;

if (index >= 0 && index < array.Length)
{
    // Array element found
}

1

配列の長さを使用して、任意の数がその範囲に収まるかどうかを確認できます。たとえば、サイズが10の配列がある場合、25は10以上であるため、array [25]は無効です。


1

むしろリストを使用できるので、存在を確認できます。

List<int> l = new List<int>();
l.Add(45);
...
...

if (l.Count == 25) {
  doStuff();
}
int num = 45;
if (l.Contains(num)) {
  doMoreStuff();
}


0

インデックスが配列の長さよりも短いかどうかを確認できます。これは、インデックスに値を割り当てることができるが、明示的に値が与えられていないnullやその他の奇妙なケースをチェックしません。


0

配列の長さをチェックして、項目25が配列内にあるという意味で有効かどうかを確認できます。次に、次を使用できます。

if (array.Length > 25)
{ 
   if (array[25] != null)
   {
       //good
   }
}

配列アイテム自体が設定されているかどうかを確認します。


0

配列を使用してさまざまなフィールドを格納しているように聞こえます。これは間違いなくコードの臭いです。高レベルのコードでは一般的に適切ではない(または必要とされない)ため、配列の使用はできるだけ避けたいと思います。

簡単な辞書に切り替えることは、短期的には実行可能なオプションかもしれません。大きなプロパティバッグクラスを使用する場合と同じように。たくさんのオプションがあります。あなたが今抱えている問題は単に悪いデザインの症状です。悪いデザインにパッチを当てるだけでなく、根本的な問題を修正することを検討する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.