2009-07-13 99 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

你真的需要一个定制的集合类型呢?这听起来像你想要做的一切都是由现有的泛型集合类型提供的,也许你只需要添加一个扩展方法或为他们。

相关问题