我有一些需要List<int?>
,我有List<int>
。如何將int列表轉換爲可爲空的列表<int>?
我可以這樣寫:
var items = value.Select(num => (int?) num).ToList();
事實果真是最簡單的方法是什麼?
我有一些需要List<int?>
,我有List<int>
。如何將int列表轉換爲可爲空的列表<int>?
我可以這樣寫:
var items = value.Select(num => (int?) num).ToList();
事實果真是最簡單的方法是什麼?
將這項工作?
var items = value.Cast<int?>().ToList();
它像一個魅力。 – scheien
這相當於原始代碼,probalby導致相同的IL代碼 –
@PanagiotisKanavos:'Select'需要'WhereSelectEnumerableIterator'的另一個實例,而'Cast'只是循環並返回'yield return(TResult)((object)current) ;'。所以'Enumerable.Cast'可能會更有效一些。 –
你也可以使用List.ConvertAll
List<int?> items = value.ConvertAll<int?>(i => i);
它的工作原理,即使在.NET 2.除此之外沒有任何優勢,所以我會留在LINQ(Enumerable.Cast
由塔米姆塞勒姆的建議),因爲它更實用並可讀。
但是,如果您需要List<int?>
而不是List<int>
爲什麼不首先使用它?
你可以使用:
List<int?> newList = oldList.ConvertAll<int?>(i => i);
雖然它可能不近,足以同下面的事情。
試試這個
var result1 = list.ConvertAll<int?>(x => x);
List<int> a = new List<int>() { 1, 2, 3, 4 };
List<Nullable<int>> b = new List<int?>();
for (int i = 0; i < a.Count; i++)
{
b.Add(new Nullable<int>(a[i]));
}
如果你想省略lambda表達式和投影。
這是如何更簡單? 7行而不是1? –
尊敬的先生們,如果您認爲簡單性是用代碼行來衡量的,那麼您就是一個白癡。讓我用一行代碼向你展示一些簡單的東西--int count = Enumerable.Range(0,500).AsParallel()。Select(x => new {Id = x})。其中(x => {if(x .Id%2 == 0 || x。Id%5 == 0)return true;返回false; })。Count(x => x.Id <200);請讓我知道如果出現問題,你將如何調試。這是一個簡單的例子,在生產代碼中想象一下。 –
如果我們跳過列表的初始化(就像上面所做的那樣),它仍然可以寫成一行 - for(int i = 0; i
避免播和轉換
List<int?> nullInts = new List<int?>();
listInts.ForEach(i => nullInts.Add(new int?(i)));
您如何避免在此處投射和轉換?轉換運算符實際上與您的代碼完全相同 - 創建一個包含非空值的新的可爲空的實例 –
只需將您的代碼和我的代碼合併到一起,並查看差異即可。在你的ildasm代碼中查找Converter。 – mopicus
如果你發現自己做這麼多,你可以實現@ TamimSalem在擴展方法解決方案:
public static class EnumerableExt
{
public static List<T?> ToNullableList<T>(this IEnumerable<T> sequence) where T: struct
{
return sequence.Cast<T?>().ToList();
}
}
然後調用它像這樣:
var items = value.ToNullableList();
在您的問題中編寫Nullable可能會更好,因爲它很混亂。 –
Dirk
似乎很簡單,我不會做得更好。 – wondra
我相信是的。這就是我想要做的事情將列表轉換爲列表> –
Yalda