簡體   English   中英

C# LINQ:從數組中刪除空值並返回為不可為空

[英]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.

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