Mi è stata fornita la seguente domanda .NET in un'intervista. Non so perché ho ottenuto voti bassi. Purtroppo non ho ricevuto un feedback.Intervista .NET, struttura del codice e il design
Domanda:
Il file hockey.csv contiene i risultati del Hockey Premier League. Le colonne "For" e "Contro" contengono il numero totale di goal segnati a favore e contro ciascuna squadra in quella stagione (quindi Alabama ha segnato 79 gol contro avversari e ha segnato 36 gol contro di loro).
Scrivere un programma per stampare il nome della squadra con la differenza più piccola tra gli obiettivi "for" e "contro".
la struttura del hockey.csv assomiglia a questo (si tratta di un file CSV valida, ma ho appena copiato i valori qui per farvi un'idea)
Team - Per - Contro
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
Soluzione:
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); }
}
}
uscita: più piccola differenza in for' and
contro' obiettivi> TEAM: Boston, OBIETTIVI DIF: -34
Può qualcuno si prega di consultare il mio codice e vedere qualcosa ovviamente sbagliato qui? Erano interessati solo alla struttura/design del codice e se il programma produce il risultato corretto (cioè la differenza più bassa). Molto apprezzato.
Come fai a sapere che hai ottenuto un punteggio basso se non hai ricevuto alcun feedback? A volte qualche altra persona si adatta meglio alla posizione, tutto qui. –
Per curiosità. Quanto tempo ti hanno dato per completare questa domanda? –
@ClaudioRedi è anche quello che mi sorprende, mi hanno appena dato un voto basso e non hanno avuto successo in questa fase. Non ho detto perché. –