簡體   English   中英

如何在將元素添加到列表之前檢查元素是否為 null?

[英]How to check if element is null before add it to list?

我有那個代碼:

List<Move> list = new List<Move>();
list.Add(GetBeatingForFieldOnSpecificDiagonal(i, enemyColor, Constant.TOP_LEFT));
list.Add(GetBeatingForFieldOnSpecificDiagonal(i, enemyColor, Constant.TOP_RIGHT));
list.Add(GetBeatingForFieldOnSpecificDiagonal(i, enemyColor, Constant.DOWN_LEFT));
list.Add(GetBeatingForFieldOnSpecificDiagonal(i, enemyColor, Constant.DOWN_RIGHT));

問題是:
這是否可以在將其添加到列表之前以某種方式檢查該元素是否不是 null?
我的意思是我不想調用該方法兩次 一個要求檢查它不是 null,另一個要求最終添加它,這是一種不好的方法,因為我正在為計算機編寫 AI 算法,任何資源都很重要。

最簡單的方法可能是在添加非空元素后僅過濾列表:

list = list.Where(l => l != null);

或者可能:

list = list.Where(l => l != null).ToList();

立即將其List<> ,因為list明確地是一個列表類型。

您可以將值存儲到變量中,檢查它是否為 null,然后將其添加到列表中:

Move tmp = GetBeatingForFieldOnSpecificDiagonal(i, enemyColor, Constant.TOP_LEFT);
if (tmp != null) {
    list.Add(tmp);
}
// The same can (should?) be done for the other moves

解決方案1:

使用 Try... out var -模式。

private bool TryGetHitForFieldOnDiagonal(int i, Color enemyColor, Constant constant,
                                         out Move move)
{
    // pesudo code
    if (finds_a_diagonal) {
        move = get_some_move;
        return true;
    }
    move = null;
    return false;
}

然后

if (TryGetHitForFieldOnDiagonal(i, enemyColor, Constant.TOP_LEFT, out var m)) list.Add(m);
if (TryGetHitForFieldOnDiagonal(i, enemyColor, Constant.TOP_RIGHT, out m)) list.Add(m);
if (TryGetHitForFieldOnDiagonal(i, enemyColor, Constant.DOWN_LEFT, out m)) list.Add(m);
if (TryGetHitForFieldOnDiagonal(i, enemyColor, Constant.DOWN_RIGHT, out m)) list.Add(m);

解決方案2:

使用 C#8.0 模式匹配並遍歷常量:

foreach (Constant c in Enum.GetValues(typeof(Constant))) {
    if (GetHitForFieldOnDiagonal(i, enemyColor, c) is { } move) list.Add(move);
}

模式{ } move是一個空屬性模式。 它測試返回值是否不是 null 並將結果綁定到新變量move


解決方案3:

解決方案 2 的循環假設您要遍歷所有常量。 如果您不想這樣做,則可以改為使用此模式匹配四次。

if (GetHitForFieldOnDiagonal(i, enemyColor, Constant.TOP_LEFT) is { } m1) list.Add(m1);
if (GetHitForFieldOnDiagonal(i, enemyColor, Constant.TOP_RIGHT) is { } m2) list.Add(m2);
if (GetHitForFieldOnDiagonal(i, enemyColor, Constant.DOWN_LEFT) is { } m3) list.Add(m3);
if (GetHitForFieldOnDiagonal(i, enemyColor, Constant.DOWN_RIGHT) is { } m4) list.Add(m4);

解決方案4:

在 C#8.0 中,您還可以聲明局部函數,即嵌入在其他方法中的方法。

void AddNonNullHitToList(Constant constant) // local function
{
    if (GetHitForFieldOnDiagonal(i, enemyColor, constant) is { } m) list.Add(m);
}

AddNonNullHitToList(Constant.TOP_LEFT);
AddNonNullHitToList(Constant.TOP_RIGHT);
AddNonNullHitToList(Constant.DOWN_LEFT);
AddNonNullHitToList(Constant.DOWN_RIGHT);

請注意,這個本地 function 可以訪問周圍方法的變量(這里是ienemyColorlist )。

暫無
暫無

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

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