我正在尝试创建一个WCF数据服务ServiceOperation,它在服务器端进行分组,然后将数据发送到客户端。
当我尝试调用它(甚至连接到服务)时,我收到错误消息。它说它无法构建一个接口。
我使用的唯一界面是IGrouping。
这个界面的实际类是什么?
更新
我在调试示例应用时检查了类型,它告诉我它是:
System.Linq.Lookup<TKey,TElement>.Grouping
但它的组装是什么?
答案 0 :(得分:25)
BCL实现IGrouping
中的几种类型,但它们都是内部的,除IGrouping
接口外无法访问。
但是IGrouping
只是一个带有关联键的IEnumerable<TElement>
。您可以轻松实现由IGrouping
支持的List<TElement>
,并且不应该难以在调用边界内进行序列化:
public class Grouping<TKey, TElement> : IGrouping<TKey, TElement> {
readonly List<TElement> elements;
public Grouping(IGrouping<TKey, TElement> grouping) {
if (grouping == null)
throw new ArgumentNullException("grouping");
Key = grouping.Key;
elements = grouping.ToList();
}
public TKey Key { get; private set; }
public IEnumerator<TElement> GetEnumerator() {
return this.elements.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
}
应用GroupBy
运算符后,您可以创建Grouping
个实例列表:
var listOfGroups =
source.GroupBy(x => ...).Select(g => new Grouping<TKey, TElement>(g)).ToList();
答案 1 :(得分:11)
这可能是IGrouping最基本和最通用的实现。它的构造函数接受一个键和一组值。
public class Grouping<TKey, TElement> : IGrouping<TKey, TElement>
{
private readonly TKey key;
private readonly IEnumerable<TElement> values;
public Grouping(TKey key, IEnumerable<TElement> values)
{
if (values == null)
throw new ArgumentNullException("values");
this.key = key;
this.values = values;
}
public TKey Key
{
get { return key; }
}
public IEnumerator<TElement> GetEnumerator()
{
return values.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
答案 2 :(得分:4)
我使用示例应用检查了类型,它是:
System.Linq.Lookup<TKey,TElement>.Grouping
。但它的装配是什么?
这是嵌套在System.Linq.Lookup<TKey,TElement>
中的类型; 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<TKey,TElement>
的公共类型。如果你需要这样的类型(比如说可序列化的话),你可能不得不自己滚动一个类型。
答案 3 :(得分:-3)
System.Core(在System.Core.dll中)http://msdn.microsoft.com/en-us/library/bb344977.aspx