如何在IE#中将IEnumerable转换为自定义类型?

时间:2009-07-13 20:46:18

标签: c# extension-methods ienumerable casting

我使用扩展方法OrderBy和ThenBy在多个字段中对自定义集合进行排序。这种排序不会影响集合,而是返回和IEnumberable。我无法将IEnumerable结果转换为我的自定义集合。有没有改变我的集合的顺序或将IEnumerable结果转换为我的自定义集合?

10 个答案:

答案 0 :(得分: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 :(得分:1)

不,没有。使用查询运算符时,它不使用原始集合的实例来生成枚举。相反,它使用私有实现(可能是匿名的,可能不是匿名的)来提供此功能。

如果你想在原始集合中使用它,你应该在类型上有一个构造函数,它带有IEnumerable<T>(或任何你的集合存储,如果它是特定的),然后将查询传递给构造函数。 / p>

然后,您可以使用此方法为名为IEnumerable<T>的{​​{1}}创建一个扩展方法,该方法将使用To<YourCollectionType>,然后将其传递给您的类型的构造函数并返回该文件。

答案 2 :(得分:1)

没有。您可以遵循ToList和ToDictionary扩展方法建立的模式 - 编写类似的扩展方法,从IEnumerable加载您自己的集合类型。

答案 3 :(得分:0)

您可以编写自己的IComparer实例,以便对自定义集合进行排序。

蛮力你可以遍历IEnumerable并将每个项目转储回自定义集合的新实例。

答案 4 :(得分:0)

您可以使用IEnumerable初始化列表:

如果的类型为IEnumerable,则可以创建如下列表:

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

或者您只需拨打 items.ToList()

var list = items.ToList();

答案 5 :(得分:0)

您的自定义集合实现了哪些界面?

如果它是IList,那么你就可以在IEnumerable上执行.ToList() 如果它是一个IDictionary,那么你就可以在IEnumerable上做.ToDictionary() 等。

将它带给更适合你的东西。

如果没有相似之处,你可以为IEnumerable编写一个扩展方法.ToMyCollection()。

答案 6 :(得分:0)

Enumerables和collection是完全不同的野兽。

枚举只允许枚举,而集合具有基于索引的访问器,Count属性等。要创建集合,您实际上必须枚举IEnumerable。像List&lt; T&gt;这样的典型集合。将有一个接受IEnumerable的构造函数。尽管如此,将进行枚举。

答案 7 :(得分:0)

如果你查看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);

答案 8 :(得分:0)

LINQ很酷,因为它将像这样的源集合视为不可变的 - 它不会修改它们。使用扩展方法只需按照您指定的备用顺序枚举它们 - 您不是以这种方式构建新的自定义列表。

我建议两个选择:

  1. 根据您的LINQ-ing
  2. 的结果自行构建新列表
  3. 将排序功能实现到您的自定义集合中(或使用一个不错的可排序泛型集合作为基础),以便它可以就地排序。

答案 9 :(得分:0)

您真的需要自定义收藏类型吗?听起来你想要做的一切都是由现有的通用集合类型提供的,也许你只需要添加一个扩展方法或者为它们添加。