簡體   English   中英

如果數組元素不存在則返回 null

[英]Return null if array element does not exist

如果數組元素不存在,是否有一種簡單的方法可以獲取值“null”?

例如,在下面的代碼中sArray有 3 個元素,前 3 次調用SomeMethod工作(打印為 true),但是第 4 次調用SomeMethod(sArray[3]); 給我一個IndexOutOfRangeException 有沒有辦法讓SomeMethod的第 4 次調用打印 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);

^更喜歡單行表達

擴展方法怎么樣?

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));
SomeMethod(sArray.Skip(3).Select(z => (int?)z).FirstOrDefault());

是一個工作替代:

SomeMethod(sArray[3]);

前者將使用null調用SomeMethod (而如果數組沒有至少 4 個條目,后者將拋出異常)。

Skip(3) ,3 可以更改為您想要從數組中檢索的任何索引。 需要Selectint投影到int? 以便FirstOrDefault返回第 4 個元素null

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

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

反而。

或者考慮使用:

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

循環遍歷數組的最多4 個元素(如果少於 4 個,它會正常工作 - 它只會減少對SomeMethod的調用)。

C# 中的數組有一個.Length屬性,您可以在嘗試將項從 1 傳遞到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...");
}

輸出

在此處輸入圖片說明

在這種情況下,我會建議您像這樣在代碼中的某處創建一個擴展

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

好吧,這不是我知道的單行解決方案,但對程序員和計算機來說都更容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM