Подтвердить что ты не робот

Что такое реализующий класс для IGrouping?

Я пытаюсь создать службу служб данных служб WCF, которая группируется на стороне сервера, а затем отправляет данные клиенту.

Когда я пытаюсь позвонить (или даже подключиться к сервису), я получаю сообщение об ошибке. В нем говорится, что он не может построить интерфейс.

Единственным интерфейсом, который я использую, является IGrouping.

Что такое/фактический класс для этого интерфейса?


Update:

Я проверил тип при отладке образца приложения, и он сказал мне, что это:

System.Linq.Lookup<TKey,TElement>.Grouping

Но какая это сборка?

4b9b3361

Ответ 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>. Если вам нужен такой тип (скажем, сериализуемый), вам, вероятно, придется катиться самостоятельно, к сожалению.