IGrouping的实现类是什么?
我正在尝试创建一个WCF数据服务ServiceOperation,它在服务器端进行分组,然后将数据发送到客户端。
当我尝试调用它(甚至连接到服务)时,我收到一个错误。 它说它无法构建一个接口。
我使用的唯一界面是IGrouping。
什么是这个界面的实际类?
更新:
我在调试示例应用程序时检查了类型,它告诉我它是:
System.Linq.Lookup.Grouping
但它的组装是什么?
BCL中的几种类型实现了IGrouping
,但它们都是内部的,除了IGrouping
接口之外无法访问。
但是, IGrouping
仅仅是具有关联键的IEnumerable
。 您可以轻松实现由List
支持的IGrouping
,并且不应该难以跨调用边界序列化:
public class Grouping : IGrouping { readonly List elements; public Grouping(IGrouping grouping) { if (grouping == null) throw new ArgumentNullException("grouping"); Key = grouping.Key; elements = grouping.ToList(); } public TKey Key { get; private set; } public IEnumerator GetEnumerator() { return this.elements.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }
应用GroupBy
运算符后,您可以创建Grouping
实例列表:
var listOfGroups = source.GroupBy(x => ...).Select(g => new Grouping(g)).ToList();
这可能是IGrouping最基本和最通用的实现。 它的构造函数接受一个键和一组值。
public class Grouping : IGrouping { private readonly TKey key; private readonly IEnumerable values; public Grouping(TKey key, IEnumerable values) { if (values == null) throw new ArgumentNullException("values"); this.key = key; this.values = values; } public TKey Key { get { return key; } } public IEnumerator GetEnumerator() { return values.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }
我使用示例应用程序检查了类型,它是:
System.Linq.Lookup
。 但它的组装是什么?.Grouping
它是嵌套在System.Linq.Lookup
; System.Core
程序集内部。
var groupingType = "1".GroupBy(x => x).Single().GetType().GetGenericTypeDefinition(); Console.WriteLine("Type: " + groupingType); Console.WriteLine("Public: " + groupingType.IsPublic); Console.WriteLine("Assembly: " + groupingType.Assembly);
输出:
Type: System.Linq.Lookup`2+Grouping[TKey,TElement] Public: False Assembly: System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
从.NET 4.0开始,核心.NET框架中没有实现System.Linq.IGrouping
公共类型。 如果你需要这样的类型(比如说可序列化的),你可能不得不自己滚动一个类型。
System.Core(在System.Core.dll中) http://msdn.microsoft.com/en-us/library/bb344977.aspx