посчитать появление 2 свойств в списке объекта c# - PullRequest
1 голос
/ 24 марта 2020

У меня есть 2 списка объектов

   List<Student> studentList = new List<Student>() { 


      new Student(){ StudentName="Bill", MobileOS = "Android"},
      new Student(){ StudentName="Bill", MobileOS = "Android"}
      new Student(){ StudentName="Steve",MobileOS = "IOS"},
      new Student(){ StudentName="Ram",  MobileOS = "IOS"},
      new Student(){ StudentName="Bill", MobileOS = "IOS"}
}

В моем другом списке я хочу сохранить отфильтрованные данные. Пример

    List<FilteredData> filteredData= new List<FilteredData>(){

          new FilteredData(){ StudentName="Bill", Count=3, Android = 2, Ios = 1},
          new FilteredData(){ StudentName="Steve",Count=1, Android = 0, Ios = 1},
          new FilteredData(){ StudentName="Ram",  Count=1, Android = 0, Ios = 1},
}

Примечание: значение Count основано на вхождении того же StudentName и числа Android и Ios основаны на MobileOS

Итак, как мне сосчитать одно и то же имя ученика и сохранить его в новом списке? Я искал весь день, но, кажется, не смог найти решение для этого

Ответы [ 2 ]

3 голосов
/ 24 марта 2020

Попробуйте следующее:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Student> studentList = new List<Student>() { 
                new Student(){ StudentName="Bill", MobileOS = "Android"},
                new Student(){ StudentName="Bill", MobileOS = "Android"},
                new Student(){ StudentName="Steve",MobileOS = "IOS"},
                new Student(){ StudentName="Ram",  MobileOS = "IOS"},
                new Student(){ StudentName="Bill", MobileOS = "IOS"}
            };

            List<FilteredData> filteredData = studentList
                .GroupBy(x => x.StudentName)
                .Select(x => new FilteredData() {
                    StudentName = x.Key,
                    Count = x.Count(),
                    Android = x.Where(y => y.MobileOS == "Android").Count(),
                    Ios = x.Where(y => y.MobileOS == "IOS").Count()
                }).ToList();
        }
    }
        public class Student
        {
            public string StudentName { get;set;}
            public string MobileOS { get;set;}

        }
        public class FilteredData
        {
            public string StudentName { get;set;}
            public int Count { get;set;}
            public int Android { get;set;}
            public int Ios { get;set;}
        }


}
3 голосов
/ 24 марта 2020

Вы можете сгруппировать результаты, используя LINQ:

List<FilteredData> filteredData = studentList
    .GroupBy(x => x.StudentName)
    .Select(x => new FilteredData()
    {
        StudentName = x.Key,
        Count = x.Count(),
        Android = x.Count(y => y.MobileOS == "Android"),
        Ios = x.Count(y => y.MobileOS == "Ios")
    }).ToList();

Обратите внимание, что это решение повторяет каждую группу три раза, но это не должно быть проблемой, если количество элементов в studentList не огромно. Тогда, возможно, будет хорошей идеей итерировать каждую группу x вручную и отслеживать числа в трех отдельных переменных внутри Select fun c.

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