簡體   English   中英

如何在IE#中將IEnumerable轉換為自定義類型?

[英]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很酷,因為它將像這樣的源集合視為不可變的 - 它不會修改它們。 使用擴展方法只需按您指定的備用順序枚舉它們 - 您不是以這種方式構建新的自定義列表。

我建議兩個選擇:

  1. 根據LINQ的結果自己構建一個新列表
  2. 將排序功能實現到您的自定義集合中(或使用一個漂亮的可排序泛型集合作為基礎),以便它可以就地排序。

你真的需要一個自定義集合類型嗎? 聽起來你想用它做的一切都是由現有的通用集合類型提供的,也許你只需要添加一個擴展方法或者為它們添加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM