1

まず、これの使用は学習のためだけであり、おそらく機能的なアプリケーションでは使用されないでしょう。

オブジェクト(カスタム)DateHandlerを受け取るクラス(という名前)を作成しました。これには、文字列を受け取り、各文字を一致するように変更する関数があります。Date

例えば:

"d/m/Y"戻ることができます"1/1/2005"

d => Day
m => Month
Y => Full Year

事前定義されていない文字は変更されないことに注意してください。

Dateクラス:

class Date
{
    #region Properties

    private int _Day;
    private int _Month;

    public int Day
    {
        get
        {
            return _Day;
        }
        set
        {
            if (value < 1)
                throw new Exception("Cannot set property Date.Day below 1");
            this._Day = value;
        }
    }
    public int Month
    {
        get
        {
            return _Month;
        }
        set
        {
            if (value < 1)
                throw new Exception("Cannot set property Date.Month below 1");
            this._Month = value;
        }
    }
    public int Year;

    #endregion

    #region Ctors

    public Date() { }
    public Date(int Day, int Month, int Year)
    {
        this.Day = Day;
        this.Month = Month;
        this.Year = Year;
    }

    #endregion
}

DateHandlerクラス:

class DateHandler
{
    #region Properties

    private Date Date;
    private Dictionary<char, string> Properties;
    private int Properties_Count;

    #endregion

    #region Ctors

    public DateHandler()
    {
        Properties = new Dictionary<char, string>();
    }

    public DateHandler(Date Date)
        : this()
    {
        this.SetDate(Date);
    }

    #endregion

    #region Methods

    public void SetDate(Date Date)
    {
        this.Date = Date;
        this.SetProperties();
    }

    private void SetProperties()
    {
        this.Properties.Add('d', this.Date.Day + "");
        this.Properties.Add('m', this.Date.Month + "");
        this.Properties.Add('Y', this.Date.Year + "");
        this.Properties.Add('y', this.Date.Year.ToString().Substring(Math.Max(0, this.Date.Year.ToString().Length - 2)));
        this.Properties_Count = Properties.Count;
    }

    public string Format(string FormatString)
    {
        int len = FormatString.Length;
        if (Properties.ContainsKey(FormatString[0]))
        {
            FormatString = FormatString.Replace(FormatString[0] + "", this.Properties[FormatString[0]] + "");
        }
        for (int i = 1; i < len; i++)
        {
            if (this.Properties.ContainsKey(FormatString[i]) && FormatString[i - 1] != '\\')
            {
                FormatString = FormatString.Replace(FormatString[i] + "", this.Properties[FormatString[i]] + "");
            }
        }
        return FormatString;
    }

    #endregion
}

私の問題: new ごとに新しい辞書を定義する必要があり、その一致定義を指す辞書が1 つDateHandlerしかないという創造的な方法を考えようとしています。どのようにアイデアはありますか?

私の主な目標: Dictionary の 1 つのインスタンスProperties。これは、 の複数のインスタンスからの値への参照として使用されますDateHandler

4

1 に答える 1

1

あなたが持っているものは不合理ではないと思いますが、いつものように物事には複数の方法があります。私の個人的な好みは、'DateHandler' を静的クラスとしてヘルパーとして使用することです (これはほとんど機能せず、非常に単純であるため)。

static class DateHandler 
{     
    #region Properties      
    private static Date Date;
    private static Dictionary<char, string> properties;
    private static Dictionary<char, string> Properties 
    {
        get
        {
            if (properties == null)
            {
                properties = new Dictionary<char, string>();
                SetProperties();
            }
            return properties;
        }
        set
        {
            properties = value;
        }
    }
    private static int Properties_Count;      
    #endregion      

    #region Methods      

    private static void SetProperties()     
    {         
        Properties.Add('d', Date.Day + "");         
        Properties.Add('m', Date.Month + "");         
        Properties.Add('Y', Date.Year + "");         
        Properties.Add('y', Date.Year.ToString().Substring(Math.Max(0, Date.Year.ToString().Length - 2)));         
        Properties_Count = Properties.Count;     
    }
    public static string Format(Date date, string FormatString)     
    {
        Date = date;
        int len = FormatString.Length;         
        if (Properties.ContainsKey(FormatString[0]))         
        {             
            FormatString = FormatString.Replace(FormatString[0] + "", Properties[FormatString[0]] + "");         
        }         
        for (int i = 1; i < len; i++)         
        {             
            if (Properties.ContainsKey(FormatString[i]) && FormatString[i - 1] != '\\')             
            {                 
                FormatString = FormatString.Replace(FormatString[i] + "", Properties[FormatString[i]] + "");             
            }         
        }         
        return FormatString;     
    }      
    #endregion 
} 

これにより、DateHandler を作成するたびに辞書をインスタンス化する必要がなくなります。あなたの使用はこのようになります。

 Date d = new Date(1, 1, 2012);

 string result = DateHandler.Format(d, "d/m/Y");

これには独自の欠点があり、「ヘルパー クラス」を避けるのが良い場合もありますが、検討の材料として役立つことを願っています。

于 2012-08-02T03:47:53.030 に答える