LINQ - Группировка объектов с подсчетом типа - PullRequest
2 голосов
/ 12 июля 2011

У меня есть коллекция объектов, каждый из которых определяется определенной «группой».Как я могу написать запрос LINQ, чтобы произвести подсчет каждого объекта, сгруппированного по «группе».

В качестве примера предположим, что у меня есть следующие классы:

public class Release 
{
     int ReleaseNumber; 

     public ReleaseDetails[] details;

}

public class ReleaseDetails
{
    string Group;

    // other details omitted
}

Для данного выпуска я бы хотел иметь возможность выводить как;

Release number 1 contains the following details;
 - 17 records in Group A
 - 12 records in Group B
 - 6 records in Group C

Любая помощь очень ценится.

Ответы [ 2 ]

2 голосов
/ 12 июля 2011

Вы можете сделать что-то вроде

var q = from d in r.Details
            group d by d.Group into counts
            select new { Count = counts.Count(), Group = counts.Key };

Полный пример:

        Release r = new Release
        {
            ReleaseNumber = 1
            ,
            Details = new ReleaseDetails[]
            {
                new ReleaseDetails { Group = "a"},
                new ReleaseDetails { Group = "a"},
                new ReleaseDetails { Group = "b"},
                new ReleaseDetails { Group = "c"},
                new ReleaseDetails { Group = "d"},
                new ReleaseDetails { Group = "d"},
                new ReleaseDetails { Group = "e"},

            }
        };

        var q = from d in r.Details
                group d by d.Group into counts
                select new { Count = counts.Count(), Group = counts.Key };

        foreach (var count in q)
        {
            Console.WriteLine("Group {0}: {1}", count.Group, count.Count);
        }
1 голос
/ 12 июля 2011

Вот, пожалуйста.

    public class ReleaseDetails
    {
        public string Group { get; set; }
        public ReleaseDetails() {}
        public ReleaseDetails(string grp){Group = grp;}
    }

            var qry = new Release();
            qry.details = new List<ReleaseDetails>();
            qry.details.Add(new ReleaseDetails("A"));
            qry.details.Add(new ReleaseDetails("A"));
            qry.details.Add(new ReleaseDetails("B"));
            qry.details.Add(new ReleaseDetails("C"));
            qry.details.Add(new ReleaseDetails("C"));
            qry.details.Add(new ReleaseDetails("B"));


 var result = from x in qry.details
                group x by x.Group into g
                select new 
                { 
                    Count = g.Count(), 
                    Group = g.Key 
                };

//Or using Labmda
var result1 = qry.details.GroupBy(x => x.Group).Select(g => new { Count = g.Count(), Group = g.Key });
...