2016-09-20 25 views
0

的列表中刪除空後,假設我有一個C#自選(這裏稱爲x)的列表,並且我通過移除空(這裏的新列表稱爲y)創建一個新的列表C#的結果類型列表中,從自選

static void Main() 
{ 
    var x = new List<long?> { 7, 8, 9, null, 10, null, 11 }; 
    var y = x.Where(e => e != null); 
    Console.WriteLine("{0}", y); 
} 

然後y的類型被推斷爲List<long?>。獲得List<long>類型的慣用方法是什麼?顯式解包或顯式轉換?或者有更清晰的方法嗎?

在我正在處理的實際實現中,值作爲可選項列表進來,我需要將這些列表轉換爲下游集合,因此「傳遞下降」到後續操作並不是我想要的做(雖然我可以在代碼中稍後做很多很多的空檢查...)。我真的很想有一個long-list的變量。這是如何最好地考慮和處理在C#中?

回答

7

只需使用x.OfType<long>().ToList() - 這將過濾掉所有空值和結果類型將爲List<long>

+1

雖然簡潔,IMO這是一個矯枉過正的事情,因爲它涉及不必要的裝箱和拆箱。 –

+0

@IvanStoev,這是一個非常有用的評論。很難在這個答案之間作出決定,這個答案簡明扼要地說「只留下所有的多數」和Jeroen的答案,這個答案很明確地說明如何將解包值存在它們存在的地方! –

+0

你說的對拳擊是正確的,但對於列表中的例子,我甚至不會去想它。無論如何,你總是可以用'Where-> Select'方法。 –

3

我會檢查的HasValue財產和選擇Value

你可以試試這個:

var y = x.Where(e => e.HasValue).Select(e => e.Value); 

不管有沒有.ToList()

0

Explit投與選擇會做的工作:

 var x = new List<long?> { 7, 8, 9, null, 10, null, 11 }; 
     var y = x.Where(e => e != null); 
     Console.WriteLine("{0}", y); 
     IEnumerable<long> z = x.Where(e => e != null).Select(e => (long)e); 
     Console.WriteLine("{0}", z); 
1

我認爲最好是創建自己的擴展方法:

public static class Extensions 
{ 
    public static IEnumerable<T> RemoveNullsAndConvert<T>(this IEnumerable<T?> source) 
     where T : struct 
    { 
     return from x in source where x != null select x.Value; 
    } 
} 

,然後用簡單的

var y = x.RemoveNullsAndConvert(); 

當然,您可以使用較短的名稱作爲方法,並且實現不一定必須使用LINQ - for instanc e它可能是一個C#迭代器:

public static class Extensions 
{ 
    public static IEnumerable<T> RemoveNullsAndConvert<T>(this IEnumerable<T?> source) 
     where T : struct 
    { 
     foreach (var x in source) 
      if (x != null) yield return x.Value; 
    } 
}