Что такое реализующий класс для IGrouping?
Я пытаюсь создать службу служб данных служб WCF, которая группируется на стороне сервера, а затем отправляет данные клиенту.
Когда я пытаюсь позвонить (или даже подключиться к сервису), я получаю сообщение об ошибке. В нем говорится, что он не может построить интерфейс.
Единственным интерфейсом, который я использую, является IGrouping.
Что такое/фактический класс для этого интерфейса?
Update:
Я проверил тип при отладке образца приложения, и он сказал мне, что это:
System.Linq.Lookup<TKey,TElement>.Grouping
Но какая это сборка?
Ответы
Ответ 1
Несколько типов в реализации 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();
Ответ 2
Вот, вероятно, самая простая и общая реализация 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();
}
}
Ответ 3
Я проверил тип с примерным приложением, и он: 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>
. Если вам нужен такой тип (скажем, сериализуемый), вам, вероятно, придется катиться самостоятельно, к сожалению.
Ответ 4
System.Core(в System.Core.dll) http://msdn.microsoft.com/en-us/library/bb344977.aspx