3

実際の値にスワップアウトしたいいくつかのフィールドを含むメッセージの文字列があります

var message = "Hi [CustomerName]. Its [TODAY], nice to see you were born on the [DOB]!";
var mappingCodes = new List<string> {"[CUSTOMER_NAME]","[DOB]",[TODAY]};
var customEmails = new Dictionary<string, string>();
var today = DateTime.Now;
var customers = new List<Customer>()
{
    new Customer()
        {
            FirstName = "Jo",
            LastName = "Bloggs",
            Email = "jo@bloggs.com",
            DOB = "10/12/1960"
        }
};
foreach (var customer in customers)
{
    var emailMessage = "";
    customEmails.Add(customer.Email,emailMessage);
}

私がやろうとしているのは、各顧客をループして、mappingCodes のいずれかを実際のコードに置き換えるメッセージを取得することです。
例 [Today] 今日CustomerNameCustomer.FirstName + Customer.LastName

何千人もの顧客がいる可能性があるので、堅牢なものが必要です。mappingCodes最初に文字列にいずれかが含まれていることを確認してから、それらを目的の値に置き換える方法がわかりません。

何かアドバイス?

4

2 に答える 2

2

あなたはこのようなことを試すことができます。String.Formatはかなり効率的です。必要に応じて、Date.Todayをフォーマットすることもできます。

var customers = new List<Customer>()
{
    new Customer()
    {
        FirstName = "Jo",
        LastName = "Bloggs",
        Email = "jo@bloggs.com",
        DOB = "10/12/1960"
    }
};
foreach (var customer in customers)
{
    var emailMessage = String.Format("Hi {0}. Its {1}, nice to see you were born on the {2}!", customer.FirstName, DateTime.Today, customer.DOB);
    customEmails.Add(customer.Email,emailMessage);
}
于 2012-11-03T00:37:46.173 に答える
1

あなたが使用することができますRegex.Replace(string, MatchEvaluator)

var customers = new[] {
    new {
        Name = "Fred Flintstone",
        City = "Bedrock"
    },
    new {
        Name = "George Jetson",
        City = "Orbit City"
    }
};

string template = "Hello, [NAME] from [CITY]!";
var re = new Regex(@"\[\w+\]"); // look for all "words" in square brackets

foreach (var customer in customers)
{
    Trace.WriteLine(
        re.Replace(template, m => {
            // determine the replacement string
            switch (m.Value) // m.Value is the substring that matches the RE.
            {
                // Handle getting and formatting the properties here
                case "[NAME]":
                    return customer.Name;
                case "[CITY]":
                    return customer.City;
                default:
                    // The "mapping code" is not supported, I just return the 
                    // original substring
                    return m.Value;
            }
        }));
}

明らかに、上記は単なる一般的なアプローチであり、マッピングコードとデータ構造をサポートするように変更する必要があります。

于 2012-11-03T00:36:42.857 に答える