1

私はこれを尋ねるのはかなりばかげていますが、命名規則を除いてほぼ同じコードを持つ2つのメソッドがあります...冗長なコードの使用を減らすためにこれを短くしたいと思います。これを実際に短縮するにはどうすればよいですか?

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 に答える