我觉得这很愚蠢,但我有两种方法,除了命名约定之外几乎都有相同的代码...我想缩短它以减少冗余代码的使用。 我该如何缩短这个?
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 :(得分: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 :(得分: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 / 2)
答案 2 :(得分: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 + "'");
答案 3 :(得分: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个函数(在这种情况下处理您的给定数据)。