Reputation: 81
I have been given the below .NET question in an interview. I don’t know why I got low marks. Unfortunately I did not get a feedback.
Question:
The file hockey.csv contains the results from the Hockey Premier League. The columns ‘For’ and ‘Against’ contain the total number of goals scored for and against each team in that season (so Alabama scored 79 goals against opponents, and had 36 goals scored against them).
Write a program to print the name of the team with the smallest difference in ‘for’ and ‘against’ goals.
the structure of the hockey.csv looks like this (it is a valid csv file, but I just copied the values here to get an idea)
Team - For - Against
Alabama 79 36
Washinton 67 30
Indiana 87 45
Newcastle 74 52
Florida 53 37
New York 46 47
Sunderland 29 51
Lova 41 64
Nevada 33 63
Boston 30 64
Nevada 33 63
Boston 30 64
Solution:
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); }
}
}
Output:
Smallest difference in for' and
against' goals > TEAM: Boston, GOALS DIF: -34
Can someone please review my code and see anything obviously wrong here? They were only interested in the structure/design of the code and whether the program produces the correct result (i.e lowest difference). Much appreciated.
Upvotes: 7
Views: 1056
Reputation: 38335
Just a few things from a cursory overview:
From the looks, it really appears you were trying to show you knew quite a bit more than what was being asked in the problem statement. But, how the knowledge you knew is being used in this exercise is quite scary, and not in a good way.
In the future, I'd recommend just solving the problem at hand and don't over-think it. Keep it simple.
Upvotes: 3
Reputation: 4730
Maybe because you wrote so many lines of code, when it can be just
var teamRecords = File.ReadAllLines("path");
var currentLow = int.MaxValue;
foreach (var record in teamRecords.Skip(1).ToList())
{
var tokens = record.Split(',');
if (tokens.Length == 3)
{
int forValue = 0;
int againstValue = 0;
if (int.TryParse(tokens[1], out forValue) && int.TryParse(tokens[2], out againstValue))
{
var difference = Math.Abs(forValue - againstValue);
if (difference < currentLow) currentLow = difference;
}
}
}
Console.WriteLine(currentLow);
Upvotes: 11
Reputation: 3439
I guess you miss understood the question. The interviewer asked the minimum difference between 'for' and 'against' goals and your program is calculating the best goal average. If you see the minimum difference then it's New York not Boston. Let me update fenix2222 code here.
var teamRecords = File.ReadAllLines(Path.Combine(Application.StartupPath,"teams.csv"));
var currentLow = int.MaxValue; //just to make sure that difference is initially less than currentLow.
foreach (var record in teamRecords.Skip(1).ToList())
{
var tokens = record.Split(',');
if (tokens.Length == 3)
{
int forValue = 0;
int againstValue = 0;
if (int.TryParse(tokens[1], out forValue) && int.TryParse(tokens[2], out againstValue))
{
var difference = 0;
if (forValue > againstValue)
difference = forValue - againstValue;
else
difference = againstValue - forValue;
if (difference < currentLow)
currentLow = difference;
}
}
}
Upvotes: 6