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

4 回答 4

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"); 
于 2013-07-20T12:45:54.190 回答
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)

于 2013-07-20T12:45:42.267 回答
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 + "'");
于 2013-07-20T12:54:19.537 回答
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 函数(在这种情况下处理您的给定数据)。

于 2013-07-20T12:54:52.540 回答