![](/img/trans.png)
[英]Convert IEnumerable<IEnumerable<T>> to List<List<T>>
[英]IEnumerable<T> to List<T>
好的,我四處尋找,找不到答案。 我有一個返回的方法
IEnumerable<ICar>
調用方法是將方法的結果存儲在
List<ICar>
但是我收到以下錯誤。
System.Collections.Generic.IEnumerable<Test.Interfaces.ICar> to
System.Collections.Generic.List<Test.Interfaces.ICar>. An explicit conversion exists
(are you missing a cast?)
我看了msdn at
IEnumerable<T> interface and List<T> class.
以下行來自msdn。
public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection,
IEnumerable
我只是不明白為什么我不能分配
IEnumerable<ICar> to List<ICar>.
有人可以向我解釋一下。 我錯過了什么
並非所有IEnumerable<T>
都是List<T>
。 反之亦然。
您可以嘗試強制轉換為List<T>
,這是不好的做法,如果它確實不是列表可能會失敗,或者您可以從枚舉中創建新列表
new List<T>(yourEnumerable);
或使用Linq
yourEnumerable.ToList();
List<ICar>
實現IEnumerable<ICar>
- 你是對的。 但這意味着你可以隱式地將List<ICar>
轉換為IEnumerable<ICar>
- 而不是相反。 要解決您的問題,只需調用IEnumerable
上的ToList()
將其轉換為List
。
您可以調用ToList
將IEnumerable<Car>
轉換為List<Car>
。
IEnumerable<ICar> cars = ...;
List<ICar> list = cars.ToList(); // OK
這不會自動發生,因為盡管您可以嘗試將IEnumerable<Car>
向下轉換為List<Car>
:
IEnumerable<ICar> cars = ...;
List<ICar> list = (List<ICar>)cars; // Compiles, but could fail at runtime.
沒有隱式轉換運算符,因此C#編譯器不允許在沒有強制轉換的情況下進行賦值。 向下轉換可能在運行時失敗,因此在大多數情況下最好使用ToList
。
IEnumerable<T>
是List<T>
但不一定是一個。 您可以使用LINQ的IEnumerable<T>.ToList<T>()
將任何IEnumerable<T>
轉換為List<T>
IEnumerable<T> foo = ThatMethodYouWereTalkingAbout();
List<T> bar;
if (foo is List<T>)
bar = (List<T>)foo;
} else {
bar = new List<T>(foo);
}
所有列表都是IEnumerable,但是所有的Innumerable都不是列表。 根據MSDN IEnumerable
公開枚舉器,它支持對非泛型集合的簡單迭代。
所有IEnumerable都承諾你可以獲得下一個元素。 List承諾更多:例如通過索引訪問並將其作為有限長度。
IEnumerable不是這種情況。 例如,下面的代碼實際上並沒有創建列表,實際上,您無法從中創建列表。 每次你要求一個新的元素,它會給你一個。 但它只在被問到時計算它。 :
IEnumerable<int> Numbers() {
int i=0;
while(true) {
yield return unchecked(i++);
}
}
您想要調用ToList來獲取列表。 請注意,這可能會在上述情況下終止。
我們不能通過變量賦值將較少派生的類型分配給更多派生類型。 多數民眾贊成不安全。
在語言規范中。 說, List<ICar>
與IEnumerable<ICar>
賦值不兼容。 但是,反過來是正確的。 IEnumerable<ICar>
與List<ICar>
兼容。
如果將賦值兼容性可視化為關系,則更有意義。 如果x <= y為真,則x> = y不為真(除非y = x)。 (具體來說,2 <3 =真,所以2> 3不成立。)
在您的情況下,我們可以將汽車列表的值分配給IEnumerable<ICar>
類型的變量。
如果我們能把這種關系表示為
List<ICar>
<= IEnumerable<ICar>
= true。
然后就是這樣
List<ICar>
= IEnumerable<ICar>
= false
這是錯誤的,因為我們知道的第一個關系是真的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.