Mam 2 listę obiektów

   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"}
}

Na mojej innej liście chcę przechowywać filtrowane dane. Przykład

    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},
}

Zauważono: wartość jest oparta na występowaniu tego samego StudentName oraz liczba Android i iOS jest oparta na MOBEROOS

Jak mogę policzyć tę samą nazwę ucznia i przechowywać go na nową listę? Szukałem całego dnia, ale wydaje mi się, że nie można znaleźć rozwiązania

-1
Choy 24 marzec 2020, 18:05

2 odpowiedzi

Najlepsza odpowiedź

Spróbuj wykonać następujące czynności:

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


}
2
jdweng 24 marzec 2020, 15:20

Możesz grupować wyniki za pomocą 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();

Należy pamiętać, że to rozwiązanie jest iteruje każdą grupę trzy razy, ale nie powinno być problemem, chyba że liczba elementów w studentList jest ogromna. Wtedy może być dobry pomysł, aby iterować przez każdą grupę {X1}} ręcznie i śledzić liczby w trzech oddzielnych zmiennych wewnątrz funkcji Select.

2
mm8 25 marzec 2020, 07:24