2011-12-14 45 views
17

Tôi đang cố tạo Dịch vụ Dữ liệu Dịch vụ WCFHoạt động nhóm ở phía máy chủ và sau đó gửi dữ liệu xuống máy khách.Lớp triển khai IGrouping là gì?

Khi tôi cố gọi nó (hoặc thậm chí kết nối với dịch vụ), tôi gặp lỗi. Nó nói rằng nó không thể xây dựng một giao diện.

Giao diện duy nhất tôi đang sử dụng là IGrouping.

Lớp học thực tế cho giao diện này là gì?


Cập nhật:

Tôi đã kiểm tra các loại trong khi gỡ một ứng dụng mẫu và nó nói với tôi đó là:

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

Nhưng những gì lắp ráp là nó trong?

+0

Xem http://stackoverflow.com/questions/5072955/is-it-possible-to-create-some-igrouping-object – ChrisF

+0

WCF Data Services ServiceOperation? Hoặc WCF hoạt động? – Jeff

+0

System.Core có tất cả triển khai LINQ. – Jeff

Trả lời

24

Một số loại trong BCL thực hiện IGrouping, tuy nhiên chúng đều là nội bộ và không thể truy cập ngoại trừ giao diện IGrouping.

Nhưng IGrouping chỉ đơn thuần là một IEnumerable<TElement> có khóa được liên kết. Bạn có thể dễ dàng thực hiện một IGrouping được hỗ trợ bởi một List<TElement> và đó không phải là khó để serialize qua giới hạn cuộc gọi:

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(); } 

} 

Sau khi áp dụng các nhà điều hành GroupBy bạn có thể tạo một danh sách các Grouping trường hợp:

var listOfGroups = 
    source.GroupBy(x => ...).Select(g => new Grouping<TKey, TElement>(g)).ToList(); 
+2

Có lẽ cách tiếp cận dễ nhất sẽ là một cái gì đó như: var newGrouping = new List () .GroupBy (t => t.MyKey); – aBetterGamer

+1

@aBetterGamer: Tôi tin rằng câu hỏi không phải là làm thế nào để tạo ra một 'IGrouping' khá dễ dàng như bạn chỉ ra nhưng làm thế nào để tái tạo" cái gì đó "thực hiện' IGrouping' ở phía bên kia của một ranh giới tuần tự hóa. –

4

Tôi đã kiểm tra các loại với một ứng dụng mẫu và nó là thế này: System.Linq.Lookup<TKey,TElement>.Grouping. Nhưng nó là gì?

Đây là loại được lồng trong System.Linq.Lookup<TKey,TElement>; nội bộ để lắp ráp 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); 

Output:

Type: System.Linq.Lookup`2+Grouping[TKey,TElement] 
Public: False 
Assembly: System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 

Tính đến .NET 4.0, không có loại nào trong lõi .NET framework mà thực hiện System.Linq.IGrouping<TKey,TElement>. Nếu bạn cần một loại như vậy (nói rằng đó là serializable), có thể bạn sẽ phải cuộn một mình, thật không may.

9

Đây có lẽ là triển khai IGrouping cơ bản và chung nhất. Hàm khởi tạo của nó lấy một khóa và một tập các giá trị.

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(); 
    } 
} 
Các vấn đề liên quan