这个数组是否存在索引?

114

我在工作中接手了一些代码,其中有很臭的味道。 我希望找到最轻松的解决方案。

是否有一种方法可以检查任意数字是否是数组中的有效元素?

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

最好不要通过foreach()遍历数组来查找行来实现这一点。

有没有一种方法可以做到这一点,或者我只能使用foreach循环?


1
你的意思是想知道数组[x]的某个值是否等于25吗?我认为你在询问数组[25]是否存在时会让人们感到困惑。如果数组中有26个或更多元素,那么它肯定存在,但我不认为这是你所要求的。 - kevin42
我正在使用的程序有两个可能具有相同文件名的数组。一个有21个元素,另一个有30多个元素。如果存在,我需要在数组[25]处的值。 - splatto
许多答案看起来是冗余的,但它们来自一个时代,在那个时代,两分钟内出现七个答案并不罕见...(因此它们可以被原谅)。但是对于五年后提交的某些答案,情况并非如此。 - Peter Mortensen
13个回答

168

测试长度

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

5
谢谢。我简直不敢相信我没想到使用.Length属性! - splatto
21
请确保索引index大于等于0。 - Andreas Grech
3
请确保数组本身不为空 :) - Shimmy Weitzhandler
1
因为在C#中,数组索引必须是连续的,这是正确的。虽然有一些集合类型没有连续的索引,但它们不是C#中基本的数组类型。 - reor

148
你也可以使用LINQ来实现这个目标:
var exists = array.ElementAtOrDefault(index) != null;

8
谢谢,这正是我所寻找的,而不是笨拙的数组长度检查。 - Starceaker
12
小注:new object[]{ null }.ElementAtOrDefault(index)将返回null,因为索引为0的元素 null。使用ElementAtOrDefault不是检查数组索引存在的好方法,添加到末尾的相等性检查会使结果不确定。 - Chris Marisic
2
@ChrisMarisic 你是对的,如果你只想检查存在性,可以使用array.Length > index - Shimmy Weitzhandler
2
@ChrisMarisic,实际上这是一个重要的注释,诸如此类的解决方案将导致隐藏的错误。 - amd
1
默认值可能为零 - undefined
显示剩余3条评论

25

"is a valid element" 是什么意思?你可以这样做:

if (array.Length >= 26)

如果您需要知道25是否为数组的有效索引(假设下限为0),可以使用以下代码:

if (array.Length > 25)
{
    // valid index
}
else
{
    // invalid index
}

如果您只需要知道它是否非空,只需使用以下代码:

if (array[25] != null)

(或者两者的组合)。

如果这些不能帮助您,请为您的问题给出更精确的“有效”含义。


8
第二个例子出现了这个错误:数组索引超出了范围 - Muhammad Raheel
4
那么看起来你应该使用第一个测试,才是最合适的选择。 - Jon Skeet

13
假设您还想检查该项不为空。
if (array.Length > 25 && array[25] != null)
{
    //it exists
}

1
注意:在if (array.Length > 25 && array[25] != null)中必须使用&&,如果使用单个&将会抛出IndexOutOfRange异常。 MSDN - checksum

5
// 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
}

2

由于ElementAtOrDefault()方法如果不存在会返回null,这可能会导致意外后果。

我通常在一行中执行以下操作:

string sval = array.ElementAtOrDefault(index) ?? "" //for strings
int ival = array.ElementAtOrDefault(index) ?? 0 //for ints
. . . //etc

我正在使用这个,但是遇到了一个错误:运算符'??'不能应用于类型为'int'和'int'的操作数。 - undefined

1
这里的答案很简单,但仅适用于一维数组。
对于多维数组,检查是否为null是一种直接告知元素是否存在的方法。此处的示例代码检查是否为null。请注意,try/catch块可能有些过度保护,但它使代码块无懈可击。
public ItemContext GetThisElement(int row,
    int col)
{
    ItemContext ctx = null;
    if (rgItemCtx[row, col] != null)
    {
        try
        {
          ctx = rgItemCtx[row, col];
        }
        catch (SystemException sex)
        {
          ctx = null;
          // Perhaps do something with sex properties
        }
    }

    return (ctx);
}

1
你可以使用列表,这样你就可以检查存在性。
List<int> l = new List<int>();
l.Add(45);
...
...

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

1

您可以使用数组的长度,看看您的任意数字是否适合该范围。例如,如果您有一个大小为10的数组,则array[25]无效,因为25不小于10。


1

array.length 会告诉你数组中有多少个元素


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接