如果数组元素不存在,则返回null

时间:2018-09-25 03:14:38

标签: c# arrays .net-core nullable

如果数组元素不存在,是否有一种简单的^方法来获取值“ null”?

例如,在下面的代码中,sArray有3个元素,对SomeMethod的前3个调用有效(打印为true),但是第4个调用SomeMethod(sArray[3]);给了我{{1 }}。有没有办法使对IndexOutOfRangeException的第四次呼叫打印为假?

SomeMethod

^更喜欢单行表达式

5 个答案:

答案 0 :(得分:4)

扩展方法如何?

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));
}

答案 1 :(得分:2)

有一个Linq方法ElementAtOrDefault

要以您想要的方式使用它(返回null),您需要将数组的基础类型更改为可为null的int:

    int?[] sArray = new int?[]{1,2,3};
    SomeMethod(sArray.ElementAtOrDefault(1000));

答案 2 :(得分:1)

SomeMethod(sArray.Skip(3).Select(z => (int?)z).FirstOrDefault());

是以下产品的有效替代品:

SomeMethod(sArray[3]);

前者将用SomeMethod调用null(而后者将在数组中没有至少4个条目时抛出异常)。

Skip(3)中,可以将3更改为要从数组中检索的任何索引。需要Select才能将int投影到int?中,以便FirstOrDefault返回第四个元素 null。 / em>

如果您不想使用LINQ,则可以使用:

SomeMethod(sArray.Length > 3 ? sArray[3] : (int?)null);

相反。

或考虑使用:

foreach (var entry in sArray.Take(4))
{
    SomeMethod(entry);
}

循环遍历数组的 个元素(如果少于4个,它将正常工作-只会对SomeMethod进行更少的调用)。

答案 3 :(得分:1)

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...");
}

输出

enter image description here

答案 4 :(得分:-1)

在这种情况下,我建议您像这样在代码中的某处创建扩展名

GET users/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "user_name": "alice"
        }
      },
      "filter": {
        "bool": {
          "should": [
            {"match": {"country": "italy"}},
            {"match": {"country": "france"}}
          ]
        }
      }
    }
  }
}

那么你可以做到

country in ['italy', 'france']

好吧,这不是我所知道的单行解决方案,但是对于程序员和计算机来说都更容易。