缩短重复代码

时间:2013-07-20 12:42:01

标签: c#

我觉得这很愚蠢,但我有两种方法,除了命名约定之外几乎都有相同的代码...我想缩短它以减少冗余代码的使用。 我该如何缩短这个?

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

4 个答案:

答案 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个函数(在这种情况下处理您的给定数据)。