Return 如果数组元素不存在则为 null
Return null if array element does not exist
如果数组元素不存在,是否有简单的^方法获取值'null'?
例如,在下面的代码中 sArray
有 3 个元素,前 3 次调用 SomeMethod
工作(打印 true),但是第 4 次调用 SomeMethod(sArray[3]);
给了我一个 IndexOutOfRangeException
。有没有办法让第 4 次调用 SomeMethod
打印 false?
static void Main(string[] args)
{
int[] sArray = new int[]{1,2,3};
SomeMethod(sArray[0]);
SomeMethod(sArray[1]);
SomeMethod(sArray[2]);
SomeMethod(sArray[3]);
}
static void SomeMethod(int? s) => Console.WriteLine(s.HasValue);
^更喜欢单行表达式
SomeMethod(sArray.Skip(3).Select(z => (int?)z).FirstOrDefault());
是以下工作的替代品:
SomeMethod(sArray[3]);
前者会用null
调用SomeMethod
(如果数组没有至少4个条目,后者会抛出异常)。
在 Skip(3)
中,3 可以更改为您要从数组中检索的任何索引。需要 Select
将 int
投影到 int?
中,以便 FirstOrDefault
returns 第 4 个元素 或 null
.
如果您不想使用 LINQ,那么您可以使用:
SomeMethod(sArray.Length > 3 ? sArray[3] : (int?)null);
相反。
或考虑使用:
foreach (var entry in sArray.Take(4))
{
SomeMethod(entry);
}
循环遍历数组的 最多 4 个元素(如果少于 4 个元素,它将正常工作 - 它只会减少对 SomeMethod
的调用) .
扩展方法怎么样?
public static T? TryGet<T>(this T[] source, int index) where T: struct
{
if (0 <= index && index < source.Length)
{
return source[index];
}
else
{
return null;
}
}
那么你可以这样写:
static void Main(string[] args)
{
int[] sArray = new int[]{1,2,3};
SomeMethod(sArray.TryGet(0));
SomeMethod(sArray.TryGet(1));
SomeMethod(sArray.TryGet(2));
SomeMethod(sArray.TryGet(3));
}
有一个Linq方法ElementAtOrDefault
要以您想要的方式使用它(返回 null
),您需要将数组的基础类型更改为可为空的 int:
int?[] sArray = new int?[]{1,2,3};
SomeMethod(sArray.ElementAtOrDefault(1000));
在这种情况下,我建议您像这样在代码中的某处创建扩展
static class ArrExt
{
public static int? Get(this int[] arr, int i)
{
return (i >= 0 && i < arr.Length) ? arr[i] : default(int?);
}
}
那么你可以这样做
int[] sArray = new int[] { 1, 2, 3 };
SomeMethod(sArray.Get(0));
SomeMethod(sArray.Get(1));
SomeMethod(sArray.Get(2));
SomeMethod(sArray.Get(3));
好吧,这不是我所知道的单行解决方案,但它对程序员和计算机来说都更容易。
C# 中的数组有一个 .Length
属性,您可以在尝试将项目从一个传递到 SomeMethod
之前检查它,典型的方法是遍历每个元素数组而不是猜测索引是否有效:
for (int i = 0; i < sArray.Length; i++)
{
SomeMethod(sArray[i]);
}
如果您引用数组中不存在的索引,您将无法避免 IndexOutOfRangeException
。
但是,如果您真的想要一个具有此类功能的方法,您可以简单地修改现有代码以检查指定的索引是否大于数组的长度。
由于您的数组是 int[]
(而不是 int?[]
),所有有效索引都将有一个值。此外,我们可以使用 ?.
来处理数组本身可能是 null
:
的情况
private static void SomeMethod(int[] array, int index) =>
Console.WriteLine(index >= 0 && index < array?.Length);
然后在使用中,不是传递带有无效索引的数组项(这将始终抛出 IndexOutOfRangeException
),而是分别传递数组本身和索引:
static void Main()
{
int[] sArray = new int[] { 1, 2, 3 };
SomeMethod(sArray, 0);
SomeMethod(sArray, 1);
SomeMethod(sArray, 2);
SomeMethod(sArray, 3);
SomeMethod(null, 0);
GetKeyFromUser("\nPress any key to exit...");
}
输出
如果数组元素不存在,是否有简单的^方法获取值'null'?
例如,在下面的代码中 sArray
有 3 个元素,前 3 次调用 SomeMethod
工作(打印 true),但是第 4 次调用 SomeMethod(sArray[3]);
给了我一个 IndexOutOfRangeException
。有没有办法让第 4 次调用 SomeMethod
打印 false?
static void Main(string[] args)
{
int[] sArray = new int[]{1,2,3};
SomeMethod(sArray[0]);
SomeMethod(sArray[1]);
SomeMethod(sArray[2]);
SomeMethod(sArray[3]);
}
static void SomeMethod(int? s) => Console.WriteLine(s.HasValue);
^更喜欢单行表达式
SomeMethod(sArray.Skip(3).Select(z => (int?)z).FirstOrDefault());
是以下工作的替代品:
SomeMethod(sArray[3]);
前者会用null
调用SomeMethod
(如果数组没有至少4个条目,后者会抛出异常)。
在 Skip(3)
中,3 可以更改为您要从数组中检索的任何索引。需要 Select
将 int
投影到 int?
中,以便 FirstOrDefault
returns 第 4 个元素 或 null
.
如果您不想使用 LINQ,那么您可以使用:
SomeMethod(sArray.Length > 3 ? sArray[3] : (int?)null);
相反。
或考虑使用:
foreach (var entry in sArray.Take(4))
{
SomeMethod(entry);
}
循环遍历数组的 最多 4 个元素(如果少于 4 个元素,它将正常工作 - 它只会减少对 SomeMethod
的调用) .
扩展方法怎么样?
public static T? TryGet<T>(this T[] source, int index) where T: struct
{
if (0 <= index && index < source.Length)
{
return source[index];
}
else
{
return null;
}
}
那么你可以这样写:
static void Main(string[] args)
{
int[] sArray = new int[]{1,2,3};
SomeMethod(sArray.TryGet(0));
SomeMethod(sArray.TryGet(1));
SomeMethod(sArray.TryGet(2));
SomeMethod(sArray.TryGet(3));
}
有一个Linq方法ElementAtOrDefault
要以您想要的方式使用它(返回 null
),您需要将数组的基础类型更改为可为空的 int:
int?[] sArray = new int?[]{1,2,3};
SomeMethod(sArray.ElementAtOrDefault(1000));
在这种情况下,我建议您像这样在代码中的某处创建扩展
static class ArrExt
{
public static int? Get(this int[] arr, int i)
{
return (i >= 0 && i < arr.Length) ? arr[i] : default(int?);
}
}
那么你可以这样做
int[] sArray = new int[] { 1, 2, 3 };
SomeMethod(sArray.Get(0));
SomeMethod(sArray.Get(1));
SomeMethod(sArray.Get(2));
SomeMethod(sArray.Get(3));
好吧,这不是我所知道的单行解决方案,但它对程序员和计算机来说都更容易。
C# 中的数组有一个 .Length
属性,您可以在尝试将项目从一个传递到 SomeMethod
之前检查它,典型的方法是遍历每个元素数组而不是猜测索引是否有效:
for (int i = 0; i < sArray.Length; i++)
{
SomeMethod(sArray[i]);
}
如果您引用数组中不存在的索引,您将无法避免 IndexOutOfRangeException
。
但是,如果您真的想要一个具有此类功能的方法,您可以简单地修改现有代码以检查指定的索引是否大于数组的长度。
由于您的数组是 int[]
(而不是 int?[]
),所有有效索引都将有一个值。此外,我们可以使用 ?.
来处理数组本身可能是 null
:
private static void SomeMethod(int[] array, int index) =>
Console.WriteLine(index >= 0 && index < array?.Length);
然后在使用中,不是传递带有无效索引的数组项(这将始终抛出 IndexOutOfRangeException
),而是分别传递数组本身和索引:
static void Main()
{
int[] sArray = new int[] { 1, 2, 3 };
SomeMethod(sArray, 0);
SomeMethod(sArray, 1);
SomeMethod(sArray, 2);
SomeMethod(sArray, 3);
SomeMethod(null, 0);
GetKeyFromUser("\nPress any key to exit...");
}
输出