В интервью мне задали следующий вопрос о .NET. Не знаю, почему у меня низкие оценки. К сожалению, я не получил отзыв.
Вопрос:
Файл хоккейный.csv содержит результаты хоккейной премьер-лиги. Столбцы «За» и «Против» содержат общее количество голов, забитых за и против каждой команды в этом сезоне (таким образом, Алабама забила 79 голов против соперников и 36 голов забила против них).
Напишите программу, которая выводит название команды с наименьшей разницей в голах «за» и «против».
Структура хоккейного.csv выглядит следующим образом (это корректный CSV-файл, но я просто скопировал сюда значения для понимания)
Команда - За - Против
Алабама 79 36
Вашингтон 67 30
Индиана 87 45
Ньюкасл 74 52
Флорида 53 37
Нью-Йорк 46 47
Сандерленд 29 51
Лова 41 64
Невада 33 63
Бостон 30 64
Невада 33 63
Бостон 30 64
Решение:
class Program
{
static void Main(string[] args)
{
string path = @"C:\Users\<valid csv path>";
var resultEvaluator = new ResultEvaluator(string.Format(@"{0}\{1}",path, "hockey.csv"));
var team = resultEvaluator.GetTeamSmallestDifferenceForAgainst();
Console.WriteLine(
string.Format("Smallest difference in ‘For’ and ‘Against’ goals > TEAM: {0}, GOALS DIF: {1}",
team.Name, team.Difference ));
Console.ReadLine();
}
}
public interface IResultEvaluator
{
Team GetTeamSmallestDifferenceForAgainst();
}
public class ResultEvaluator : IResultEvaluator
{
private static DataTable leagueDataTable;
private readonly string filePath;
private readonly ICsvExtractor csvExtractor;
public ResultEvaluator(string filePath){
this.filePath = filePath;
csvExtractor = new CsvExtractor();
}
private DataTable LeagueDataTable{
get
{
if (leagueDataTable == null)
{
leagueDataTable = csvExtractor.GetDataTable(filePath);
}
return leagueDataTable;
}
}
public Team GetTeamSmallestDifferenceForAgainst() {
var teams = GetTeams();
var lowestTeam = teams.OrderBy(p => p.Difference).First();
return lowestTeam;
}
private IEnumerable<Team> GetTeams() {
IList<Team> list = new List<Team>();
foreach (DataRow row in LeagueDataTable.Rows)
{
var name = row["Team"].ToString();
var @for = int.Parse(row["For"].ToString());
var against = int.Parse(row["Against"].ToString());
var team = new Team(name, against, @for);
list.Add(team);
}
return list;
}
}
public interface ICsvExtractor
{
DataTable GetDataTable(string csvFilePath);
}
public class CsvExtractor : ICsvExtractor
{
public DataTable GetDataTable(string csvFilePath)
{
var lines = File.ReadAllLines(csvFilePath);
string[] fields;
fields = lines[0].Split(new[] { ',' });
int columns = fields.GetLength(0);
var dt = new DataTable();
//always assume 1st row is the column name.
for (int i = 0; i < columns; i++)
{
dt.Columns.Add(fields[i].ToLower(), typeof(string));
}
DataRow row;
for (int i = 1; i < lines.GetLength(0); i++)
{
fields = lines[i].Split(new char[] { ',' });
row = dt.NewRow();
for (int f = 0; f < columns; f++)
row[f] = fields[f];
dt.Rows.Add(row);
}
return dt;
}
}
public class Team
{
public Team(string name, int against, int @for)
{
Name = name;
Against = against;
For = @for;
}
public string Name { get; private set; }
public int Against { get; private set; }
public int For { get; private set; }
public int Difference
{
get { return (For - Against); }
}
}
Выход:
Наименьшая разница в для и
против голов > КОМАНДА: Бостон, РАЗНИЦА ГОЛОВ: -34
Может кто-нибудь просмотреть мой код и увидеть здесь что-то явно неправильное? Их интересовала только структура/дизайн кода и выдает ли программа правильный результат (то есть наименьшую разницу). Очень признателен.