2013-04-09 114 views
0

我有一個csv文件,有2列,IDFlag。有很多Flag值,但有一些表示錯誤的東西 - 錯誤,失敗等。我需要做的是相當簡單 - 搜索Flag列,看看這些值中的任何一個是否在「Bad Flags」組中。在csv文件的列中搜索值

我有以下代碼,做我所需要的 - 檢查標誌文件是否存在,遍歷每行,將其拆分,然後檢查當前行是否有標誌元素,然後檢查標誌是否在我的壞組 - 如果我發現連一個我做:

private bool CheckFlagStatus(string directory) 
{ 
    // Bad flags 
    const int Flag1 = 1; 
    const int Flag2 = 5; 
    const int Flag3 = 6; 
    const int Flag4 = 42; 
    const int Flag5 = 61; 

    bool isGood = true; 
    string flagFilePath= Path.Combine(directory, "flags.csv"); 
    if (File.Exists(flagFilePath)) 
    { 
     using (StreamReader reader = new StreamReader(flagFilePath)) 
     { 
      string line; 
      while (!string.IsNullOrEmpty(line = reader.ReadLine())) 
      { 
       var splitval = line.Split(','); 
       if (splitval.Length == 2) 
       { 
        var flagString = splitval[1]; 
        int flag; 
        bool parsed = Int32.TryParse(flagString, out flag); 
        if (parsed) 
        { 
         if (flag == Flag1 || flag == Flag2 || flag == Flag3 
          || flag == Flag4 || flag == Flag5) 
         { 
          isGood = false; 
          break; 
         } 
        } 
       } 
      } 
     } 
    } 
    return isGood; 
} 

雖然這個作品,這是一個非常線性的強力方法。雖然有20行的flags.csv文件是完美的,但如果有一百萬行會發生什麼?我想知道如何使這更優雅或優化它有什麼建議。

回答

1

這已經過優化。如果有一百萬行需要更長的時間,但性能是線性的,比大多數算法好得多。你可以讓你的代碼更優雅,但這只是一個樣式問題,並且與你實際做的或者它的最優化無關。請記住,優化的代碼通常比較冗長。

通過做一些像File.ReadLines然後拆分一個新行然後拆分,然後遍歷列表只查看奇怪的索引你的代碼可能會更優雅(少線),但性能不會更好。事實上,它可能會更糟。

1

你的代碼是好的,它是這樣的檢查每一行,我只是儘量讓你的代碼更易讀使用LINQ和Readlines方法:

private bool CheckFlagStatus(string directory) 
{ 
    badFlags = new[] { 1, 5, 6, 42, 61}; 
    string flagFilePath = Path.Combine(directory, "flags.csv"); 

    if (File.Exists(flagFilePath)) 
    { 
     var lines = File.ReadLines(flagFilePath) 
         .Where(line => !string.IsNullOrEmpty(line)); 

     foreach (var line in lines) 
     { 
      var splitval = line.Split(','); 
      if (splitval.Length == 2) 
      { 
       var flagString = splitval.Last(); 
       int flag; 

       if (int.TryParse(flagString, out flag)) 
       { 
        if (badFlags.Contains(flag)) return false; 
       } 
      } 
     }  
    } 
    return true; 
}