C# 缩短重复代码

C# 缩短重复代码,c#,C#,问这个问题我觉得很傻,但我有两个方法,除了命名约定外,它们的代码几乎相同。。。我想缩短这个时间以减少冗余代码的使用。 我该如何缩短这个 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Text.RegularExpressions; namespace empTRUST { class DBDicti

问这个问题我觉得很傻,但我有两个方法,除了命名约定外,它们的代码几乎相同。。。我想缩短这个时间以减少冗余代码的使用。 我该如何缩短这个

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;
        }
   }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
使用System.Text.RegularExpressions;
命名空间空信任
{
类DBDictionary:DBBase
{
公共数据库字典()
:base(“字典”、“单词”)
{
}
公共列表AngerPercent(字符串状态)
{
List dataList=新列表();
var wordPattern=newregex(@“\w+”);
DataRow[]rows=fbTab.Select(“流派=‘愤怒’”);
foreach(wordPattern.Matches中的匹配(状态))
foreach(行中的变量项)
if(item[“Word”].ToString().ToLower()==match.ToString().ToLower())
{
数据列表。添加(项);
}
返回数据列表;
}
公共列表CaringPercent(字符串状态)
{
List dataList=新列表();
var wordPattern=newregex(@“\w+”);
DataRow[]rows=fbTab.Select(“流派=‘关怀’”);
foreach(wordPattern.Matches中的匹配(状态))
foreach(行中的变量项)
if(item[“Word”].ToString().ToLower()==match.ToString().ToLower())
{
数据列表。添加(项);
}
返回数据列表;
}
}
}
公共列表限定百分比(字符串状态,字符串选择限定符)
{
List dataList=新列表();
var wordPattern=newregex(@“\w+”);
DataRow[]rows=fbTab.Select(selectQualifier);
foreach(wordPattern.Matches中的匹配(状态))
foreach(行中的变量项)
if(item[“Word”].ToString().ToLower()==match.ToString().ToLower())
{
数据列表。添加(项);
}
返回数据列表;
}
可以这样称呼:

    List<DataRow> angerPercent = QualifyPercent(status,"Genre = 'Angry'");
List angerPercent=QualifyPercent(状态为“类型=‘生气’”);

我相信代码可以变得更简单(这更多的是一个评论而不是一个答案,因为它与原始问题无关):

public List QualifyPercent(字符串状态,字符串selectQualifier)
{
var matchList=status.Split(“.ToCharArray()”);
变量数据列表=
fbTab.Select(selectQualifier).OfType().Select(行=>
匹配列表。选择(
m=>m.ToString().ToLower()==row[“Word”].ToString().ToLower()).Any();
返回数据列表;
}
喜欢linq,这应该更快,因为linq的性质
Any()
只会运行循环,直到找到结果-这应该会加快O(n/2)

公共列表限定百分比(字符串状态,字符串选择限定符) { List dataList=新列表(); var wordPattern=newregex(@“\w+”); DataRow[]rows=fbTab.Select(selectQualifier); foreach(wordPattern.Matches中的匹配(状态)) foreach(行中的变量项) if(item[“Word”].ToString().ToLower()==match.ToString().ToLower()) { 数据列表。添加(项); } 返回数据列表; } 可以这样称呼:

    List<DataRow> angerPercent = QualifyPercent(status,"Genre = 'Angry'");
List angerPercent=QualifyPercent(状态为“类型=‘生气’”);

我相信代码可以变得更简单(这更多的是一个评论而不是一个答案,因为它与原始问题无关):

public List QualifyPercent(字符串状态,字符串selectQualifier)
{
var matchList=status.Split(“.ToCharArray()”);
变量数据列表=
fbTab.Select(selectQualifier).OfType().Select(行=>
匹配列表。选择(
m=>m.ToString().ToLower()==row[“Word”].ToString().ToLower()).Any();
返回数据列表;
}

喜欢linq,这应该更快,因为linq的性质
Any()
只会运行循环,直到找到结果-这应该会加快速度O(n/2)

流派是唯一不同的东西,所以只需将其移动到方法参数列表:

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

流派是唯一不同的东西,因此只需将其移动到方法参数列表:

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

您已经有了一个参数,为什么不使用
'carcing'
将位也更改为基于一个参数呢

public List<DataRow> AngerPercent(string status)
...
   DataRow[] rows = fbTab.Select("Genre = 'Angry'");
public List AngerPercent(字符串状态)
...
DataRow[]rows=fbTab.Select(“流派=‘愤怒’”);
变成

public List<DataRow> AngerPercent(string status, string query)
...
   DataRow[] rows = fbTab.Select("Genre = '" + query + "'");
public List AngerPercent(字符串状态,字符串查询)
...
DataRow[]rows=fbTab.Select(“流派=”+“查询+”);

您已经有了一个参数,为什么不将
'carcing'
的位也更改为基于一个参数呢

public List<DataRow> AngerPercent(string status)
...
   DataRow[] rows = fbTab.Select("Genre = 'Angry'");
public List AngerPercent(字符串状态)
...
DataRow[]rows=fbTab.Select(“流派=‘愤怒’”);
变成

public List<DataRow> AngerPercent(string status, string query)
...
   DataRow[] rows = fbTab.Select("Genre = '" + query + "'");
public List AngerPercent(字符串状态,字符串查询)
...
DataRow[]rows=fbTab.Select(“流派=”+“查询+”);
你的方法不应该知道你想传递给他什么数据-1 method=1函数(在本例中处理你的给定数据)


你的方法不应该知道你想传递给他什么数据-1 method=1函数(在本例中处理你给定的数据)。

从@Hogan稍微更一般的方法来看,显然调用者有责任确保包含引号的类型被正确转义。你的方法表明你的函数处理它,但它实际上并没有处理它。嗯,总是有地方使它更通用,但是你也必须考虑这是公共接口的一部分,因此有一个问题,关于调用者必须知道多少实现细节:例如整个过滤器表达式的格式或者仅仅是(有效的)。价值观
DataRow[] data = fbTab.Select("Genre = 'Angry'");
// DataRow[] data = fbTab.Select("Genre = 'Caring'");

Percent("Status1", data);