在C#中使用linq对结果集合进行分组

时间:2016-11-28 19:47:25

标签: c# linq

我有一个结果集,我从执行我正在使用的存储过程中返回。以下是结果集的示例:

 var staff = new Staff[]
        {
            new Staff{Code = 5, Name = "Sam", Team = "AB1"},
            new Staff{Code = 6, Name = "Dave", Team="RAB"},
            new Staff{Code = 6, Name = "Dave", Team="ABC"},
        };

根据我正在处理的数据集,工作人员可以在多个团队中运作。

我想要做的是将它们分组,以便显示如下结果:

Value  ChildValues
Dave   [RAB, ABC]
Sam    [AB1]

我怎样才能做到这一点?我通过复制主列表尝试了以下内容,但我知道以下内容不正确:

 var query = staff.GroupJoin(staff, s => s.Code, 
            s => s.Code, (s, result) => new StaffResult(s.Name, result));

我很欣赏有关上述内容的协助。

3 个答案:

答案 0 :(得分:1)

您应该使用GroupBy方法来实现此目标。

var grouped = staff.GroupBy(x=>x.Name, x=>x.Team);

该语句按名称对数据进行分组,每个分组将保留团队。

您可以在https://msdn.microsoft.com/en-us/library/bb545971.aspx?f=255&MSPPError=-2147217396找到更多信息。

希望它有所帮助。

答案 1 :(得分:1)

尝试以下查询:

var staff = new Staff[]
        {
            new Staff{Code = 5, Name = "Sam", Team = "AB1"},
            new Staff{Code = 6, Name = "Dave", Team="RAB"},
            new Staff{Code = 6, Name = "Dave", Team="ABC"},
        };

        var grouped = staff.GroupBy(m => m.Name)
            .Select(p => new { Value = p.Key, ChildVlues = p.Select(m => m.Team) })
            .ToList();

这里我按Name分组。比我创建新的匿名类型并将Key组(代表名称)添加到Value。另外,我将p.Select(m => m.Team)添加到ChildValues,因为您需要收集名称。

答案 2 :(得分:0)

查看Linq中的GroupBy语句:

https://msdn.microsoft.com/en-us/library/bb534304(v=vs.110).aspx

看起来像

    public func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
        if (annotation is MKUserLocation) {
            return nil
        }
        var annotationView: MKAnnotationView?
        // personalize annotationView
        return annotationView
    }

这会为您提供一个分组,如果需要,您可以通过foreach或其他linq查询进行访问