2012-06-22 35 views
7

Tôi đã nhận được câu hỏi .NET dưới đây trong một cuộc phỏng vấn. Tôi không biết tại sao tôi có điểm thấp. Rất tiếc, tôi không nhận được phản hồi.Cuộc phỏng vấn .NET, cấu trúc mã và thiết kế

Câu hỏi:

Các hockey.csv tập tin chứa các kết quả từ Hockey Premier League. Các cột ‘For’ và ‘Against’ chứa tổng số bàn thắng ghi được và chống lại từng đội trong mùa giải đó (vì vậy Alabama ghi được 79 bàn thắng vào lưới đối thủ, và có 36 bàn thắng ghi bàn với họ).

Viết chương trình để in tên nhóm với sự khác biệt nhỏ nhất trong mục tiêu ‘for’ và ‘against’.

cấu trúc của hockey.csv trông như thế này (nó là một tập tin csv hợp lệ, nhưng tôi chỉ cần sao chép các giá trị ở đây để có được một ý tưởng)

Team - Ví - 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

Giải pháp:

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: sự khác biệt nhỏ trong for' and chống lại' bàn thắng> TEAM: Boston, MỤC TIÊU DIF: -34

Ai đó có thể xin vui lòng xem xét mã của tôi và thấy bất cứ điều gì rõ ràng là sai ở đây? Họ chỉ quan tâm đến cấu trúc/thiết kế của mã và liệu chương trình có tạo ra kết quả chính xác hay không (tức là sự khác biệt thấp nhất). Nhiều đánh giá cao.

+3

Làm cách nào để bạn biết rằng bạn có điểm thấp nếu bạn không nhận được bất kỳ phản hồi nào? Đôi khi một số người khác chỉ phù hợp hơn cho vị trí, đó là tất cả. –

+0

Hết sức tò mò. Họ đã cho bạn bao lâu để hoàn thành câu hỏi này? –

+0

@ClaudioRedi đó là những gì làm tôi ngạc nhiên là tốt, họ chỉ cho tôi đánh dấu thấp và nói không thành công ở giai đoạn này. Không nói tại sao. –

Trả lời

6

Tôi đoán bạn lỡ hiểu câu hỏi. Người phỏng vấn đã hỏi sự khác biệt tối thiểu giữa 'for' và 'against' mục tiêu và chương trình của bạn đang tính toán mức trung bình mục tiêu tốt nhất. Nếu bạn thấy sự khác biệt tối thiểu thì đó là New York không Boston. Hãy để tôi cập nhật fenix2222 mã tại đây.

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

Tại sao bạn không chỉ sử dụng sự khác biệt = Math.Abs ​​(forValue - againstValue). Nhưng tôi nhận được quan điểm của bạn, tôi đã viết mã của tôi dựa trên ý kiến ​​j_lewis. Tôi đã cập nhật mã của mình – fenix2222

+0

có ngoài khóa học, cảm ơn. tôi đã vội vàng đưa những suy nghĩ của tôi vào đây :) – ABH

+2

+1 cho xe bán tải tốt – fenix2222

11

Có lẽ vì bạn đã viết rất nhiều dòng mã, khi nó có thể được chỉ

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

Tôi sẽ nói một điều tương tự --- tại sao nó phải bao gồm một giao diện, một DataTable, và như vậy? Sau đó, một lần nữa, tôi không thể viết bất cứ điều gì gần như tốt như bạn đã làm, vì vậy những gì tôi biết :) – CptSupermrkt

+0

Đồng ý. @j_lewis đọc csv của bạn không cần thiết lâu. Nghi ngờ họ đang tìm kiếm câu trả lời ngắn với các khái niệm OO giới hạn. –

+0

Nếu họ dự kiến ​​sử dụng thừa kế và đa hình mà có thể đã nói như vậy và có lẽ đã đưa ra câu hỏi hơi khác nhau. Nó không phải là phổ biến để tạo ra một cơ sở hạ tầng lớn như vậy chỉ để đọc một số tập tin csv. Hiệu quả của mã ban đầu là khá xấu. – fenix2222

3

Chỉ cần một vài điều từ một cái nhìn tổng quan lướt qua:

  1. Có 2 giao diện, nhưng không có giá trị trong cả hai mục đích sử dụng của họ.
  2. Không có lý do gì để giới thiệu một DataTable cho báo cáo vấn đề.
  3. Mã quá phức tạp.
  4. Việc sử dụng IList và IEnumerable trong giao diện phương thức GetTeams sẽ được sử dụng 'chỉ vì'.
  5. Lớp ResultEvaluator không thể sử dụng lại được, tức là ngay sau khi bạn khởi tạo lớp, bạn không bao giờ có thể đặt lại tệp csv. Bạn chỉ có thể tiếp tục gọi cùng một phương thức (GetTeamSmallestDifferenceForAgainst) nhiều lần; không có tài sản công cộng nào khác.
  6. Trong phương thức GetDataTable, các trường chuỗi [] được khai báo trên một dòng và sau đó giá trị được đặt trên dòng tiếp theo.
  7. Có ít hơn 0 lý do để sử dụng biểu tượng @ cho tham số 'cho' trong hàm tạo lớp của nhóm; chỉ cần đổi tên từ dành riêng 'thành' thành một thứ khác.
  8. Có nhiều cấu trúc từ 3.5+ .NET có thể được sử dụng để giải quyết vấn đề dễ dàng hơn nhiều; điều này chỉ cho thấy sự thiếu hiểu biết về ngôn ngữ.

Từ ngoại hình, có vẻ như bạn đang cố gắng cho bạn biết rõ hơn một chút so với những gì đã được hỏi trong báo cáo sự cố. Tuy nhiên, làm thế nào những kiến ​​thức bạn biết đang được sử dụng trong bài tập này là khá đáng sợ, và không phải là một cách tốt.

Trong tương lai, tôi khuyên bạn chỉ nên giải quyết vấn đề ở bàn tay và đừng nghĩ quá nhiều. Giữ nó đơn giản.

+0

1+ cho giải pháp của bạn. Tôi đồng ý rằng tôi có thể quá phức tạp. Cám ơn :) –

Các vấn đề liên quan