[英]How to check the list is null or empty before firstordefault()
[英]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 可以訪問周圍方法的變量(這里是i
, enemyColor
和list
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.