2009-07-13 153 views
5

我使用擴展方法OrderBy和ThenBy在多個字段上對自定義集合進行排序。這種排序不會影響集合,而是返回並且IEnumberable。我無法將IEnumerable結果投射到我的自定義集合中。無論如何改變我的集合的順序或將IEnumerable結果轉換爲我的自定義集合?如何將IEnumerable轉換爲C#中的自定義類型?

回答

6

如果您收藏類型實現IList<T>(要能Add()它),你可以寫一個擴展方法:

public static Extensions 
{ 
    public static TColl ToTypedCollection<TColl, T>(this IEnumerable ien) 
     where TColl : IList<T>, new() 
    { 
     TColl collection = new TColl(); 

     foreach (var item in ien) 
     { 
      collection.Add((T) item); 
     } 

     return collection; 
    } 
} 
1

不,沒有。在使用查詢操作符時,它不會使用原始集合的實例來生成枚舉。相反,它使用私有實現(可能是匿名的,可能不是)來提供此功能。

如果你想它原來的集合中,你應該有這需要一個IEnumerable<T>(或任何您的收藏店,如果它是具體的),然後通過查詢構造類型的構造函數。

然後,您可以使用它來創建IEnumerable<T>稱爲To<YourCollectionType>擴展方法,其將採取IEnumerable<T>,然後把它傳遞給你的類型的構造函數和返回。

+0

或鑄造操作者,對於這種情況似乎更好。 – Dykam 2009-07-13 21:28:36

+0

錯字:鑄造操作員 – Dykam 2009-07-13 21:29:12

1

不可以。您可以按照ToList和ToDictionary擴展方法建立的模式 - 編寫一個類似的擴展方法來從IEnumerable中加載自己的集合類型。

0

您可以編寫您自己的IComparer實例,以便能夠對自定義收集進行排序。

蠻力,你可以通過IEnumerable循環,並將每個項目轉儲回您的自定義集合的新實例。

0

您可以IEnumerable的初始化列表:

如果項目是IEnumerable類型,你可以創建像這樣的列表:

var list = new List<string>(items); 

,或者你可以簡單地調用items.ToList( )

var list = items.ToList(); 
0

您的自定義集合實現了哪些接口?

如果一個IList那麼你可以在IEnumerable的 做.ToList()如果一個IDictionary那麼你可以在IEnumerable的 等做.ToDictionary()..

將它帶給更適合你的東西。

如果沒有類似的東西,你可以爲IEnumerable編寫擴展方法爲.ToMyCollection()。

0

枚舉和集合是相當不同的野獸。

枚舉只允許枚舉集合具有基於索引的訪問器,計數屬性等。要創建一個集合,你實際上必須枚舉IEnumerable。像列表<T>典型的集合將有一個接受IEnumerable的構造函數。儘管如此,枚舉仍將執行。

0

如果你看看System.Linq。枚舉類有

var myEnumerable = this.GetEnumerator(); 

var array = myEnumerable.ToArray(); 
var list myEnumerable.ToList(); 

你可以按照這個方法,並創建一個自定義的擴展方法,將轉換到您的自定義集合的幾個擴展方法,將aloow你給你的IEnumerable類型轉換到任何一個數組,ToList

public static CustomCollection<TSource> ToCustomCollection<TSource>(this IEnumerable<TSource> source); 
0

LINQ很酷,因爲它把源的集合像這樣爲永恆不變的 - 它不修改它們。使用擴展方法只需按照您指定的替代順序枚舉它們即可 - 您不是以這種方式構建新的自定義列表。

我建議兩個選項:

  1. 構建基於對您的LINQ-ING
  2. 實現排序功能集成到您的自定義集合的結果的新列表自己(或使用一個很好的排序泛型集合作爲基地),所以它可以就地排序。
0

你真的需要一個定製的集合類型呢?這聽起來像你想要做的一切都是由現有的泛型集合類型提供的,也許你只需要添加一個擴展方法或爲他們。

相關問題