Интервью по .NET, структура кода и дизайн

В интервью мне задали следующий вопрос о .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

Может кто-нибудь просмотреть мой код и увидеть здесь что-то явно неправильное? Их интересовала только структура/дизайн кода и выдает ли программа правильный результат (то есть наименьшую разницу). Очень признателен.

7
задан Charles 6 September 2012 в 05:52
поделиться