2012-06-22 12 views
7

私はインタビューで以下の.NET質問を受けました。なぜ私は低得点を得たのかわかりません。残念ながら、私はフィードバックを得ていませんでした。.NETインタビュー、コード構造とデザイン

質問:

ファイルhockey.csvはホッケープレミアリーグからの結果が含まれています。 「For」と「Against」の欄には、そのシーズンの各チームの得点の合計数が表示されます(Alabamaは相手に対して79ゴールを決め、36ゴールを獲得しました)。

「for」と「against」ゴールの差が最も小さいチームの名前を印刷するプログラムを作成します。

hockey.csvの構造は、(それが有効なcsvファイルですが、私はアイデアを得るためにここに値をコピーした)

チームを次のようになります

- について -

反し

アラバマ州79 36

ワシントン67 30

インディアナ87 45

ニューカッスル74 52

フロリダ53 37

ニューヨーク46 47

サンダーランド29 51

LOVA 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); } 
    } 
} 

出力:ボストン、GOALS DIF::「目標> TEAMに対するfor' andで 最小の差が-34

誰かが私のコードを確認してくださいことができ、明らかに間違っているものはここに見てください。彼らは、コードの構造/設計およびプログラムが正しい結果(すなわち、最も低い差異)を生成するかどうかにのみ興味があった。とても有難い。たぶん

+3

フィードバックを受け取っていない場合は、得点が低いことをどのように知っていますか?時には、他の人がポジションを良くするだけの場合もあります。 –

+0

好奇心がそそられていません。どのくらい彼らはあなたにこの質問を完了させるようにしましたか? –

+0

@ClaudioRediそれは私にも驚かせるものですが、彼らは私に低い印を付けて、この段階では失敗したと言っています。理由を言わなかった。 –

答えて

6

することができたとき、私はあなたが質問を理解し欠場と思い、コードのように多くの行を書いたので。インタビュアーは、 'for'と 'against'の目標の最小の違いを尋ねました。あなたのプログラムは最良の目標平均を計算しています。最小の差異がある場合はニューヨークボストンです。私にfenix2222コードをここで更新させてください。通り一遍の概要から

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; 
        } 
       } 
      } 
+0

なぜあなたは単にdifference = Math.Abs​​(forValue - againstValue)を使わないのですか?しかし、私はあなたのポイントを得る、私はj_lewisのコメントに基づいて自分のコードを書いていた。私は自分のコードを更新しました – fenix2222

+0

はい、オフコース、ありがとう。私はちょうどここに私の考えを置くために急いでいた:) – ABH

+2

良いピックアップのための+1 – fenix2222

11

それだけで

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); 
+0

私は同様のことを言うつもりでした---なぜインターフェイス、DataTableなどを含む必要がありましたか?それでは、もう一度、あなたと同じくらい良いものを書くことができなかったので、私は何を知っていますか? – CptSupermrkt

+0

合意しました。あなたのcsvの読みは不必要に長くなっていました。彼らは限られたオブジェクト指向の概念で短い答えを探していました。 –

+0

もし相続と多型の使用が期待されていたのであれば、おそらくやや異なった質問をしたでしょう。このような大規模なインフラストラクチャを作成して、一部のCSVファイルを読み取るのは一般的ではありません。元のコードの効率はかなり悪いです。 – fenix2222

3

ただ、いくつかのこと:

  1. 2つのインタフェースがありますが、その用途のいずれかに値がありません。
  2. 問題文にDataTableを導入する理由はありません。
  3. コードは過度に複雑です。
  4. GetTeamsメソッドでIListとIEnumerableを使用すると、「とにかく」使用されるように見えます。
  5. ResultEvaluatorクラスは再利用できません。つまり、クラスをインスタンス化すると、すぐにcsvファイルを再設定することはできません。あなたは同じメソッド(GetTeamSmallestDifferenceForAgainst)を何度も繰り返し呼び出すことしかできません。他の公共財産は利用できません。
  6. GetDataTableメソッドでは、文字列[] fieldsは1行で宣言され、値は次の行に設定されます。
  7. チームクラスのコンストラクタの 'for'パラメータに@記号を使用する理由はありません。予約語 'for'の名前を変更するだけです。
  8. 問題を簡単に解決するために使用できる3.5+ .NETのコンストラクトが多数あります。これは単に言語の理解の欠如を示しています。

見た目からは、あなたが問題の文で尋ねられていたものよりかなり多くを知っていることを示しているように見えているようです。しかし、あなたが知っていた知識がこの演習でどのように使われているかは、非常に怖いです。良い方法ではありません。

今後、私はこの問題をただちに解決することを推奨し、それを熟考しないでください。単純にする。

+0

あなたの解決策のために1+。私はあまりにも複雑なことに同意する。どうも :) –

関連する問題