数组索引是不是存在
Posted
技术标签:
【中文标题】数组索引是不是存在【英文标题】:Does Index of Array Exist数组索引是否存在 【发布时间】:2010-10-22 03:21:24 【问题描述】:我在工作中继承了一些非常难闻的代码。我希望找到最轻松的解决方案。
有没有办法检查某个任意数字是否是数组中的有效元素?
示例 - 我需要检查 array[25] 是否存在。
最好不要通过数组执行 foreach() 来查找行。
有没有办法做到这一点,还是我被 foreach 循环卡住了?
【问题讨论】:
你的意思是你想知道 array[x] 的某个值是否 == 25?我认为您通过询问 array[25] 是否存在而使人们对您的要求感到困惑。如果数组中有 26 个或更多元素,它当然存在,但我认为这不是您所要求的。 我正在使用的程序有两个可能具有相同文件名的数组。一个有 21 个元素,另一个有 30 个元素。如果存在,我需要 array[25] 处的值。 【参考方案1】:测试长度
int index = 25;
if(index < array.Length)
//it exists
【讨论】:
谢谢。我不敢相信我没有想到 .Length 属性! 确保索引 >= 0。 并确保数组本身不为空:) 因为数组索引在 C# 中要求是连续的,这是正确的。有些集合类型没有顺序索引,但它们不是 C# 中的基本 Array 类型。【参考方案2】:您也可以使用 LINQ 来实现:
var exists = array.ElementAtOrDefault(index) != null;
【讨论】:
谢谢,这是我要找的,而不是笨拙的数组长度检查。 次要注意,new object[] null .ElementAtOrDefault(index)
将返回 null
,因为 0 处的元素 是 null
。使用ElementAtOrDefault
不是检查数组索引存在 的好方法,添加到末尾的相等性检查会使结果无法确定。
@ChrisMarisic 你能举个例子吗?
@ChrisMarisic 你是对的,如果你想检查存在只做array.Length > index
。
@ChrisMarisic,其实这是一个重要说明,这样的解决方案会导致隐藏的错误【参考方案3】:
“是一个有效的元素”到底是什么意思?你可以这样做:
if (array.Length >= 26)
它会告诉你 25 是否是数组的有效索引(假设下限为 0)。
如果您需要知道它是否为非空,只需使用:
if (array[25] != null)
(或两者的组合)。
如果这些没有帮助,请为您的问题给出更准确的“有效”含义。
【讨论】:
第二个例子我得到了这个。Index was outside the bounds of the array
@raheel:那么听起来你应该使用第一个测试来代替......【参考方案4】:
假设您还想检查项目是否不为空
if (array.Length > 25 && array[25] != null)
//it exists
【讨论】:
注意:必须在if (array.Length > 25 && array[25] != null)
中使用&&
,如果使用单个&
会抛出IndexOutOfRange异常。 MSDN.【参考方案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
【讨论】:
【参考方案6】:您可以使用数组的长度,并查看您的任意数字是否适合该范围。例如,如果您有一个大小为 10 的数组,则 array[25] 无效,因为 25 不小于 10。
【讨论】:
【参考方案7】:您可以使用列表,这样您就可以检查是否存在。
List<int> l = new List<int>();
l.Add(45);
...
...
if (l.Count == 25)
doStuff();
int num = 45;
if (l.Contains(num))
doMoreStuff();
【讨论】:
【参考方案8】:array.length
会告诉你数组中有多少元素
【讨论】:
【参考方案9】:这里的答案很简单,但仅适用于一维数组。 对于多维数组,检查 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);
【讨论】:
【参考方案10】:您可以检查索引是否小于数组的长度。这不会检查空值或其他可以为索引分配一个值但没有显式给定值的奇怪情况。
【讨论】:
【参考方案11】:您可以检查数组的长度以查看第 25 项在数组中是否有效,然后您可以使用
if (array.Length > 25)
if (array[25] != null)
//good
查看数组项本身是否已设置。
【讨论】:
【参考方案12】:听起来很像您在使用数组来存储不同的字段。这绝对是一种代码味道。我会尽可能避免使用数组,因为它们在高级代码中通常不适合(或不需要)。
短期内切换到简单的字典可能是一个可行的选择。就像使用一个大的属性包类一样。有很多选择。你现在遇到的问题只是糟糕设计的症状,你应该着眼于解决根本问题,而不是仅仅修补糟糕的设计,所以它现在有点,有点像现在这样。
【讨论】:
以上是关于数组索引是不是存在的主要内容,如果未能解决你的问题,请参考以下文章