是否存在数组索引


89

我在工作中继承了一些代码,它们的气味很差。我希望找到最轻松的解决方案。

有没有一种方法可以检查某个任意数字在数组中是否为有效元素?

示例-我需要检查array [25]是否存在。

最好我更喜欢这样做,而不用通过数组的foreach()来找到行。

有什么办法做到这一点,还是我陷入了foreach循环的困境?


您是否想知道是否array [x]的某些值== 25?我认为您通过询问array [25]是否存在使人们对您的要求感到困惑。如果数组中有26个或更多元素,则肯定存在,但我认为这不是您要的。
kevin42

我正在使用的程序具有两个可能具有相同文件名的数组。一个包含21个元素,另一个包含30个元素。如果需要,我需要array [25]处的值。
splatto

Answers:


144

测试长度

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

3
谢谢。我不敢相信我没有想到.Length属性!
splatto

13
确保索引> = 0也是如此。
Andreas Grech

2
并确保数组本身不为null :)
Shimmy Weitzhandler

1
因为在C#中要求数组索引是顺序的,所以这是正确的。有些集合类型没有顺序索引,但是在C#中不是基本的数组类型。
reor

99

您也可以使用LINQ来实现:

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

4
谢谢,这是我想要的,而不是笨拙的数组长度检查。
Starceaker

6
次音符new object[]{ null }.ElementAtOrDefault(index)将返回,null因为0 的元素null。使用ElementAtOrDefault并不是检查数组索引是否存在的好方法,添加到末尾的相等性检查会使结果不确定。
克里斯·马里西克

@ChrisMarisic您能举个例子吗?
FMFF '17

2
@ChrisMarisic是正确的,以防万一您只想检查是否存在array.Length > index
Shimmy Weitzhandler's

2
@ChrisMarisic,实际上这是一个主要说明,类似的解决方案将导致隐藏的错误
amd

21

您所说的“有效元素”到底是什么意思?您可以这样做:

if (array.Length >= 26)

它将告诉您25是否是数组的有效索引(假设下限为0)。

如果您需要知道它是否为非null,请使用:

if (array[25] != null)

(或两者的结合)。

如果这些方法没有帮助,请针对您的问题提供更准确的含义“有效”。


3
第二个例子,我明白了。Index was outside the bounds of the array
穆罕默德·拉希尔

4
@raheel:好吧,听起来您应该使用第一个测试...
Jon Skeet 2015年

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的数组,则array [25]无效,因为25不少于10。


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

听起来非常像您正在使用数组来存储不同的字段。这绝对是代码的味道。我会避免使用尽可能多的数组,因为它们通常不适合(或不需要)高级代码。

在短期内,切换到简单的Dictionary可能是一个可行的选择。就像使用大型属性包类一样。有很多选择。您现在遇到的问题只是不良设计的症状,您应该着眼于解决潜在的问题,而不是仅仅修补不良设计,因此暂时来说,它基本上可以工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.