Пока код работает, меня беспокоят две вещи:
- Проблемы культуры: В настоящее время я использую replace('.', ',') для обработки десятичных точек, что кажется хрупкий.
- Производительность/чистота: я использую несколько статических методов и ручной цикл для заполнения своего словаря.
Вот моя полная реализация:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace filmapp
{
internal class Film
{
public int Sorszam { get; set; }
public string Cim { get; set; }
public string Mufaj { get; set; }
public int BemutatasiEv { get; set; }
public string Rendezo { get; set; }
public int Nezoszam { get; set; }
public double AtlagosJegyar { get; set; }
public Film (string sor)
{
string[] sor2 = sor.Split(';');
Sorszam = Convert.ToInt32(sor2[0]);
Cim = sor2[1];
Mufaj = sor2[2];
BemutatasiEv = Convert.ToInt32(sor2[3]);
Rendezo = sor2[4];
Nezoszam = Convert.ToInt32(sor2[5]);
// Currently replacing dot to comma for local parsing
AtlagosJegyar = Convert.ToDouble(sor2[6].Replace('.', ','));
}
public static List Beolvasas(string fajlnev)
{
List filmek = new List();
string[] sorok = File.ReadAllLines(fajlnev);
for (int i = 1; i < sorok.Length; i++)
{
if (!string.IsNullOrWhiteSpace(sorok))
{
filmek.Add(new Film(sorok));
}
}
return filmek;
}
}
internal class Program
{
static List filmek = new List();
static void Main(string[] args)
{
Feladat4();
Feladat5();
Feladat6();
Feladat7();
Feladat8();
Console.ReadKey();
}
static void Feladat4() => filmek = Film.Beolvasas("filmek.csv");
static void Feladat5() => Console.WriteLine("5. feladat: {0} film található az állományban", filmek.Count);
static void Feladat6()
{
int osszeg = 0;
for (int i = 0; i < filmek.Count; i++)
{
osszeg += filmek.Nezoszam;
}
double atlag = (double)osszeg / filmek.Count;
Console.WriteLine("6.feladat: A filmek átlagos nézőszáma {0:0.0} fő", atlag);
}
static void Feladat7()
{
Console.WriteLine("7. feladat: 2018 után megjelent, népszerű filmek:");
foreach (var f in filmek.Where(x => x.Nezoszam > 1000000 && x.BemutatasiEv > 2018))
{
Console.WriteLine($"\t-{f.Cim} ({f.BemutatasiEv})");
}
}
static void Feladat8()
{
Console.WriteLine("8. feladat: Műfajok összesített nézőszáma:");
Dictionary mufajNezoszam = new Dictionary();
for (int i = 0; i < filmek.Count; i++)
{
string mufaj = filmek.Mufaj;
int nezoszam = filmek.Nezoszam;
if (mufajNezoszam.ContainsKey(mufaj))
mufajNezoszam[mufaj] += nezoszam;
else
mufajNezoszam.Add(mufaj, nezoszam);
}
var rendezett = mufajNezoszam.OrderByDescending(x => x.Value);
foreach (var item in rendezett)
{
Console.WriteLine($"\t- {item.Key}: {item.Value} fő");
}
}
}
}
Is there a way to simplify the Feladat8 logic using LINQ GroupBy? And how should I handle the Double.Parse so it doesn't break on different Windows region settings?