2009-01-23 45 views
99

如何將List<MyObject>轉換爲IEnumerable<MyObject>然後再返回?在列表<T>和IEnumerable之間自由轉換<T>

我想這樣做是爲了在列表上運行一系列的LINQ語句, G。 Sort()

+0

這是在這個問題中涵蓋http://stackoverflow.com/questions/31708/how-can-i-convert-ienumerablet-to-listt-in-c – John 2010-03-04 15:59:25

回答

141
List<string> myList = new List<string>(); 
IEnumerable<string> myEnumerable = myList; 
List<string> listAgain = myEnumerable.ToList(); 
+29

但要注意,myEnumarable是相同的對象實例myList,但listAgain與myEnumerable不是同一個對象實例。根據您想要做什麼以及myEnumerable是什麼,「列表 listAgain = myEnumerable as List ;」可能會更好。 – ChrisW 2009-01-23 12:12:54

+1

Chrisw:哦,是的,你當然是對的,但IEnumerable接口是不可變的,所以它不會在這個方向上引發問題,並且當你有一個可以處理類型安全的函數時,只會覺得*髒*。 – 2009-01-23 12:17:19

+1

你也可以使用原始的myList對象。 (我想我真的不知道這個問題) – sth 2009-01-23 12:27:51

5

旁白:需要注意的是標準的LINQ運營商(按剛纔的例子),不改變現有的名單 - list.OrderBy(...).ToList()將創建一個基於重新排序的序列中的新名單。這是很容易,然而,創建一個擴展方法,使您可以使用lambda表達式與List<T>.Sort

static void Sort<TSource, TValue>(this List<TSource> list, 
    Func<TSource, TValue> selector) 
{ 
    var comparer = Comparer<TValue>.Default; 
    list.Sort((x,y) => comparer.Compare(selector(x), selector(y))); 
} 

static void SortDescending<TSource, TValue>(this List<TSource> list, 
    Func<TSource, TValue> selector) 
{ 
    var comparer = Comparer<TValue>.Default; 
    list.Sort((x,y) => comparer.Compare(selector(y), selector(x))); 
} 

然後你可以使用:

list.Sort(x=>x.SomeProp); // etc 

這將更新一樣現有列表List<T>.Sort通常會這樣做。

21

A List<T>IEnumerable<T>,所以實際上,不需要將List<T>「轉換」爲IEnumerable<T>。 由於List<T>IEnumerable<T>,您可以簡單地將List<T>分配給類型爲IEnumerable<T>的變量。

周圍的其他方式,不是每個IEnumerable<T>List<T> offcourse,所以那麼你就必須調用IEnumerable<T>ToList()成員方法。

9

A List<T>已經是IEnumerable<T>,所以你可以直接在你的List<T>變量上運行LINQ語句。

如果你看不到像OrderBy()這樣的LINQ擴展方法,我猜這是因爲你的源文件中沒有using System.Linq指令。

你需要的LINQ表達式的結果轉換回List<T>明確,雖然:

List<Customer> list = ... 
list = list.OrderBy(customer => customer.Name).ToList() 
0

爲了防止在存儲器備份,ReSharper的是在暗示這樣的:

List<string> myList = new List<string>(); 
IEnumerable<string> myEnumerable = myList; 
List<string> listAgain = myList as List<string>() ?? myEnumerable.ToList(); 

.ToList()返回一個新的不可變列表。因此,對ListAgain的更改不會影響@Tamas Czinege答案中的myList。在大多數情況下,這是正確的,至少有兩個原因:這有助於防止影響其他區域的一個區域發生變化(鬆散耦合),並且它非常易讀,因爲我們不應該用編譯器問題來設計代碼。

但是有些情況下,如處於一個緊密的循環中,或者在嵌入式或低內存系統上工作,需要考慮編譯器的考慮因素。

0

List(T)類實現了IEnumerable(T)(以及很多其他的如IList(T),ICollection(T),IEnumerable(T)),因此不需要將List轉換回IEnumerable。

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Person person1 = new Person() { Id = 1, Name = "Person 1" }; 
Person person2 = new Person() { Id = 2, Name = "Person 2" }; 
Person person3 = new Person() { Id = 3, Name = "Person 3" }; 

List<Person> people = new List<Person>() { person1, person2, person3 }; 

//Converting to an IEnumerable 
IEnumerable<Person> IEnumerableList = people; 

但是從IEnumerable的轉換列表是一個有效的方案

IEnumerable<Person> OriginallyIEnumerable = new List<Person>() { person1, person2 }; 
List<Person> convertToList = OriginallyIEnumerable.ToList(); 

這是Entity Framework有用。

相關問題