[英]How do I convert IEnumerable to a custom type in C#?
我使用擴展方法OrderBy和ThenBy在多個字段上對自定義集合進行排序。 這種排序不會影響集合,而是返回和IEnumberable。 我無法將IEnumerable結果轉換為我的自定義集合。 反正有沒有改變我的集合的順序或將IEnumerable結果轉換為我的自定義集合?
如果你的集合類型實現了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;
}
}
不,沒有。 使用查詢運算符時,它不使用原始集合的實例來生成枚舉。 相反,它使用私有實現(可能是匿名的,可能不是)來提供此功能。
如果你想在原始集合中使用它,你應該在類型上有一個構造函數,它帶有一個IEnumerable<T>
(或者你的集合存儲,如果它是特定的),然后將查詢傳遞給構造函數。
然后,您可以使用此方法為IEnumerable<T>
創建一個名為To<YourCollectionType>
的擴展方法,該方法將獲取IEnumerable<T>
,然后將其傳遞給您的類型的構造函數並返回該方法。
不可以。您可以遵循ToList和ToDictionary擴展方法建立的模式 - 編寫類似的擴展方法,從IEnumerable加載您自己的集合類型。
您可以編寫自己的IComparer實例,以便能夠對自定義集合進行排序。
蠻力你可以遍歷IEnumerable並將每個項目轉儲回自定義集合的新實例。
您可以使用IEnumerable初始化列表:
如果items的類型為IEnumerable,則可以創建如下列表:
var list = new List<string>(items);
或者你可以簡單地調用items.ToList() :
var list = items.ToList();
您的自定義集合實現了哪些接口?
如果它是一個IList,那么你就可以在IEnumerable上做.ToList()如果它是一個IDictionary,那么你就可以在IEnumerable Etc上做.ToDictionary()。
把它帶給更適合你的東西。
如果沒有相似之處,你可以為IEnumerable編寫一個擴展方法.ToMyCollection()。
可枚舉物和收藏品是完全不同的野獸。
枚舉只允許枚舉,而集合具有基於索引的訪問器,Count屬性等。 要創建集合,您實際上必須枚舉IEnumerable。 像List <T>這樣的典型集合將有一個接受IEnumerable的構造函數。 盡管如此,將進行枚舉。
如果查看System.Linq.Enumerable類,有一些擴展方法可以讓你將IEnumerable類型轉換為Array,ToList
var myEnumerable = this.GetEnumerator();
var array = myEnumerable.ToArray();
var list myEnumerable.ToList();
您可以按照此方法創建一個自定義擴展方法,該方法將轉換為您的自定義集合
public static CustomCollection<TSource> ToCustomCollection<TSource>(this IEnumerable<TSource> source);
LINQ很酷,因為它將像這樣的源集合視為不可變的 - 它不會修改它們。 使用擴展方法只需按您指定的備用順序枚舉它們 - 您不是以這種方式構建新的自定義列表。
我建議兩個選擇:
你真的需要一個自定義集合類型嗎? 聽起來你想用它做的一切都是由現有的通用集合類型提供的,也許你只需要添加一個擴展方法或者為它們添加。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.