[英]C# LINQ: remove null values from an array and return as not nullable
我正在將可為空的數組轉換為不可為空的數組。 這是我當前帶有兩個函數調用的代碼:
myarray.Where(e => e.HasValue).Select(e => e.Value)
它看起來是一個非常基本的操作。 是否可以在一次通話中做到這一點?
myarray.OfType<int>();
這是有效的,因為如果它們不為空,可空類型會框到它們的基礎類型,但如果它們為空,則不會。
你總是可以做你自己的擴展,但這只會讓你的代碼看起來更簡潔,老實說,你認為你的實現是最簡潔明了的
public static IEnumerable<T> GetNonNullValues<T>(this IEnumerable<Nullable<T>> items) where T: struct
{
return items.Where(a=>a.HasValue).Select(a=>a.Value);
}
嘗試使用.OfType(...)
例子...
myarray.OfType<int>()
......這對我有用......
var d = new int?[] { 1, 2, 3, 4, 5, null, null, 6, 7, 8, 9, null };
Console.WriteLine(d.Count()); // 12
Console.WriteLine(d.OfType<int>().Count()); //9
試試這個:
myarray.Where(e => e.HasValue).Select(e => e.GetValueOrDefault()))
您的表達式非常漂亮,而且由於Enumerables
的循環方式,您的集合在技術上不會在兩個單獨的循環中被訪問兩次。
如果你仍然想用一個表達式來做,這里是許多丑陋的方法之一。
myarray.Aggregate(Enumerable.Empty<YourElementType>(), (prev, next) => next.HasValue? prev.Concat(new [] { next }) : prev);
永遠不應使用上述內容,僅用於演示目的。 我會使用您在問題中寫的內容,您的更漂亮。
雖然.OfType<>
解決方案有效,但意圖不是很清楚,我建議這個解決方案與問題中的解決方案幾乎相同,但它允許編譯器和例如 R# 在輸出類型中確定而不是對可能的空引用異常發出警告(例如,C# 8 中的可為空對象)。
myarray
.Where(e => e != null)
.Select(e => e ?? new Exception("Unexpected null value"))
這似乎有點矯枉過正,可以用例如“e!”來修復,但它對未來的錯誤更安全(如果例如錯誤地修改了 where 子句)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.