我使用扩展方法OrderBy和ThenBy在多个字段中对自定义集合进行排序。这种排序不会影响集合,而是返回和IEnumberable。我无法将IEnumerable结果转换为我的自定义集合。有没有改变我的集合的顺序或将IEnumerable结果转换为我的自定义集合?
答案 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很酷,因为它将像这样的源集合视为不可变的 - 它不会修改它们。使用扩展方法只需按照您指定的备用顺序枚举它们 - 您不是以这种方式构建新的自定义列表。
我建议两个选择:
答案 9 :(得分:0)
您真的需要自定义收藏类型吗?听起来你想要做的一切都是由现有的通用集合类型提供的,也许你只需要添加一个扩展方法或者为它们添加。