2013-07-20 55 views
1

我覺得很愚蠢的問這個,但我有兩個方法幾乎相同的代碼,除了命名約定...我想縮短這個以減少冗餘代碼的使用。 我怎樣才能縮短這個?縮短重複代碼

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 
using System.Text.RegularExpressions; 

namespace empTRUST 
{ 
    class DBDictionary : DBBase 
    { 
     public DBDictionary() 
      : base("Dictionary", "Word") 
     { 
     } 

     public List<DataRow> AngerPercent(string status) 
     { 
      List<DataRow> dataList = new List<DataRow>(); 
      var wordPattern = new Regex(@"\w+"); 
      DataRow[] rows = fbTab.Select("Genre = 'Angry'"); 
      foreach (Match match in wordPattern.Matches(status)) 
       foreach (var item in rows) 
        if (item["Word"].ToString().ToLower() == match.ToString().ToLower()) 
        { 
         dataList.Add(item); 
        } 

      return dataList; 
     } 

     public List<DataRow> CaringPercent(string status) 
     { 
      List<DataRow> dataList = new List<DataRow>(); 
      var wordPattern = new Regex(@"\w+"); 
      DataRow[] rows = fbTab.Select("Genre = 'Caring'"); 
      foreach (Match match in wordPattern.Matches(status)) 
       foreach (var item in rows) 
        if (item["Word"].ToString().ToLower() == match.ToString().ToLower()) 
        { 
         dataList.Add(item); 
        } 

      return dataList; 
     } 
    } 
} 
+0

[更好的地方。](http://codereview.stackexchange.com/) – Lion

回答

5

體裁是唯一不同的是調用它時

public List<DataRow> GenrePercent(string status, string genre) 
    { 
     List<DataRow> dataList = new List<DataRow>(); 
     var wordPattern = new Regex(@"\w+"); 
     DataRow[] rows = fbTab.Select(String.Format("Genre = '{0}'", genre.Replace("'", "''"))); 
     foreach (Match match in wordPattern.Matches(status)) 
      foreach (var item in rows) 
       if (item["Word"].ToString().ToLower() == match.ToString().ToLower()) 
       { 
        dataList.Add(item); 
       } 

     return dataList; 
    } 

然後,您可以通過流派名稱:所以只是將其移動到的方法參數列表

GenrePercent("Status1", "Angry"); 
    GenrePercent("Status2", "Caring"); 
+1

從@ Hogan的稍微更通用的方法來看,顯然調用者有責任確保包含引號的流派能夠正確轉義。你的方法*建議你的函數處理它,但實際上並沒有處理它。 – hvd

+0

那麼,總是有空間讓這個更通用的,但也必須考慮這是公共接口的一部分,所以有一個問題關於調用者必須知道多少實現細節:例如,整個過濾器表達式的格式或狀態和流派的唯一(有效)值。我最終會在這裏添加一個(更通用的)私有方法,它會有參數化過濾器。 –

+1

對不起,我可以看到你如何按照你的方式來評論我的評論,但我並不是說你應該讓你的方法更通用,也不應該讓你的方法更通用。我只是說如果你不這樣做,你的函數應該是處理特殊字符轉義的函數。 – hvd

4
public List<DataRow> QualifyPercent(string status, string selectQualifier) 
    { 
     List<DataRow> dataList = new List<DataRow>(); 
     var wordPattern = new Regex(@"\w+"); 
     DataRow[] rows = fbTab.Select(selectQualifier); 
     foreach (Match match in wordPattern.Matches(status)) 
      foreach (var item in rows) 
       if (item["Word"].ToString().ToLower() == match.ToString().ToLower()) 
       { 
        dataList.Add(item); 
       } 

     return dataList; 
    } 

調用它像這樣:

List<DataRow> angerPercent = QualifyPercent(status,"Genre = 'Angry'"); 

我認爲代碼可以變得更加簡單(這比答案更多評論,因爲它無關與原來的問題):

public List<DataRow> QualifyPercent(string status, string selectQualifier) 
{ 
    var matchList = status.Split(" ".ToCharArray()); 

    var dataList = 
     fbTab.Select(selectQualifier).OfType<DataRow>().Select(row => 
     matchList.Select(
      m => m.ToString().ToLower() == row["Word"].ToSring().ToLower()).Any()); 

       return dataList; 
} 

愛linq,這應該是更快,因爲linq Any()的性質將只運行循環,直到找到結果 - 這應該加快它(O/N)

1

你已經有一個參數,爲什麼不'Caring'改變位是基於一個參數呢?

public List<DataRow> AngerPercent(string status) 
... 
    DataRow[] rows = fbTab.Select("Genre = 'Angry'"); 

成爲

public List<DataRow> AngerPercent(string status, string query) 
... 
    DataRow[] rows = fbTab.Select("Genre = '" + query + "'"); 
0
public List<DataRow> Percent(string status, DataRow[] rows) 
{ 
    List<DataRow> dataList = new List<DataRow>(); 
    var wordPattern = new Regex(@"\w+"); 

    foreach (Match match in wordPattern.Matches(status)) { 
     foreach (var item in rows) { 
      if (item["Word"].ToString().ToLower() == match.ToString().ToLower()) { 
       dataList.Add(item); 
      } 
     } 
    } 

    return dataList; 
} 

這樣調用:

DataRow[] data = fbTab.Select("Genre = 'Angry'"); 
// DataRow[] data = fbTab.Select("Genre = 'Caring'"); 

Percent("Status1", data); 

你的方法應該不知道,什麼樣的數據,你想通過他 - 1方法= 1個功能(在這種情況下處理您的給定數據)。