немного сложный linq для C # - PullRequest
       1

немного сложный linq для C #

2 голосов
/ 22 сентября 2011

Я задал вопрос, прежде чем получить счетчик данных на стороне сервера, и мне было предоставлено решение на сайте. Было предложено использовать linq, который отлично работал, однако, поскольку я относительно новичок в этом, мне нужна небольшая помощь.

Используя решение Джона:

class Guy
{
    public int age; public string name;
    public Guy( int age, string name ) {
        this.age = age;
        this.name = name;
    }

}

class Program
{
    static void Main( string[] args ) {
        var GuyArray = new Guy[] { 
        new Guy(22,"John"),new Guy(25,"John"),new Guy(27,"John"),new Guy(29,"John"),new Guy(12,"Jack"),new Guy(32,"Jack"),new Guy(52,"Jack"),new Guy(100,"Abe")};

    var peeps = from f in GuyArray group f by f.name into g select new { name = g.Key, count = g.Count() };

        foreach ( var record in peeps ) {
            Console.WriteLine( record.name + " : " + record.count );
        }

    }
}

Я могу получить количество случаев появления Джона, Джейка и Эйба, используя приведенные выше рекомендации, предложенные Джоном. Однако, что, если проблема была немного сложнее, например

var GuyArray = new Guy[] { 
new Guy(22,"John", "happy"),new Guy(25,"John", "sad"),new Guy(27,"John", "ok"),
new Guy(29,"John", "happy"),new Guy(12,"Jack", "happy"),new Guy(32,"Jack", "happy"),
new Guy(52,"Jack", "happy"),new Guy(100,"Abe", "ok")};

Приведенный выше код прекрасно работает для получения количества вхождений различных имен, но что, если мне нужно количество вхождений имен, а также количество вхождений каждого человека, который счастлив, грустен или в порядке. то есть вывод: Имя, количество имен, количество счастливых имен, количество печальных имен, количество имен в порядке. Если linq не лучшее решение для этого, я готов выслушать все альтернативы. Ваша помощь очень ценится.

Ответы [ 2 ]

7 голосов
/ 22 сентября 2011

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

var nameGroups = from guy in GuyArray 
                 group guy by guy.name into g
                 select new { 
                     name = g.Key,
                     count = g.Count(),
                     happy = g.Count(x => x.status == "happy"),
                     sad = g.Count(x => x.status == "sad"),
                     ok = g.Count(x => x.status == "ok")
                 };

Тогда:

foreach(nameGroup in nameGroups) {
    Console.WriteLine("Name = {0}, Count = {1}, Happy count = {2}, Sad count = {3}, Okay count = {4}", nameGroup.name, nameGroup.count, nameGroup.happy, nameGroup.sad, nameGroup.ok);
}

Если вы хотите, чтобы все счастливы, грустны, хорошо, вы можете сказать:

Console.WriteLine(nameGroups.Sum(nameGroup => nameGroup.happy));

и т.д.

Кроме того, вы должны сделать перечисление

public enum Mood {
    Happy,
    Sad,
    Okay
}

, а затем

class Guy {
    public int Age { get; set; }
    public string Name { get; set; }
    public Mood Mood { get; set; }
}

так что вместо этого вы можете написать:

var people = from guy in guyArray 
             group guy by guy.Name into g
             select new { 
                 Name = g.Key,
                 Count = g.Count(),
                 HappyCount = g.Count(x => x.Mood == Mood.Happy),
                 SadCount = g.Count(x => x.Mood == Mood.Sad),
                 OkayCount = g.Count(x => x.Mood == Mood.Okay)
             };
1 голос
/ 22 сентября 2011
To do so: 

   class Guy
    {
        public int age; public string name; string mood;
        public Guy( int age, string name,string mood ) {
            this.age = age;
            this.name = name;
            this.mood = mood;
        }

    }

    class Program
    {
        static void Main( string[] args ) {
           var GuyArray = new Guy[] { 
new Guy(22,"John", "happy"),new Guy(25,"John", "sad"),new Guy(27,"John", "ok"),
new Guy(29,"John", "happy"),new Guy(12,"Jack", "happy"),new Guy(32,"Jack", "happy"),
new Guy(52,"Jack", "happy"),new Guy(100,"Abe", "ok")};


        var peepsSad = from f in GuyArray where f.mood=="sad" group f by f.name into g select new { name = g.Key, count = g.Count() };

 var peepsHappy = from f in GuyArray where f.mood=="happy" group f by f.name into g select new { name = g.Key, count = g.Count() };

 var peepsOk = from f in GuyArray where f.mood=="ok" group f by f.name into g select new { name = g.Key, count = g.Count() };


            foreach ( var record in peepsSad ) {
                Console.WriteLine( record.name + " : " + record.count );
            }

  foreach ( var record in peepsHappy ) {
                Console.WriteLine( record.name + " : " + record.count );
            }

  foreach ( var record in peepsOk ) {
                Console.WriteLine( record.name + " : " + record.count );
            }

        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...