2017-02-23 6 views
-1

イムの一部で最高の価値ある列挙型のエントリを選択するにはどうすればよい、それは私がすべての利用可能なテンプレートの中で最も適切から使用するテンプレートと列挙型を解決するのに役立ちますは、私はいくつかのC#のコードを探して名前

I以下のEnumerationを持っています

public enum TextTemplateTypeEnum 
{ 
    BookingConfirmationV1 = 1, 
    BookingConfirmationV2, 
    BookingConfirmationTescoV1, 
    BookingConfirmationV3, 
    BookingConfirmationTescoV2, 
    BookingConfirmationAsdaV1 
} 

その後、私は正しいと最新のテキストテンプレートを選択して、使用するテンプレート解決する必要があるので、私は機能

string customerName = Tesco; 
ReasonEnum reason = ReasonEnum.BookingConfirmation 
にpasssed以下の変数を持っています私はそれが顧客名で

TextTemplateTypeEnum.BookingConfirmationTescoV2 

が、インスタンスのためになる上記の変数のように、最も適切なテンプレートの最高V *を選択する必要があり、そのINFOMATIONと

は正しい

string customerName = Waitrose; 

ました返すためにテンプレートが

TextTemplateTypeEnum.BookingConfirmationV3 
+0

これはあなたが 'switch'を使う必要があるようです。 –

答えて

0

まあだろう、あなたは、最後の文字でそれを注文、列挙型でクライアント名を検索しEnum.GetNamesを使用することができます

string client="Tesco"; 
var template=Enum.GetNames(typeof(TextTemplateTypeEnum)) 
        .Where(x => x.Contains(client)) 
        .OrderByDescending(o => o.Substring(o.Length - 1, 1)) 
        .FirstOrDefault(); 

if (template==null) 
{ 
     template = Enum.GetNames(typeof(TextTemplateTypeEnum)) 
         .Where(x => x.Length == 21) 
         .OrderByDescending(o => o.Substring(o.Length - 1, 1)) 
         .FirstOrDefault(); 
} 

TextTemplateTypeEnum t = (TextTemplateTypeEnum)Enum.Parse(typeof(TextTemplateTypeEnum), template); 

しかし、この実装には2つの問題が考えられます。まず、バージョン10に達すると、たとえばV10で終了するので、バージョン10になるとどうなりますか?もう1つは「汎用」テンプレートです。このコードではサイズ(21)で見ていますが、これはあまり信頼できません。したがって、このコードを動作させるには、一般的なテンプレート名をBookingConfirmationGenericV2に変更することをお勧めします(正しいものを得るために「Generic」を探すことができます)。バージョンは少なくとも2桁(BookingConfirmationV01)です。

編集

[OK]を、今、私はあなたが理由のために別の列挙型を持っていたことに気づきました。この方法は、あなたのために働く場合を見てみましょう:

static TextTemplateTypeEnum GetTemplate(string client,ReasonEnum reason) 
{ 
    string reasonString = Enum.GetName(typeof(ReasonEnum), reason); 
    string enumToSearch = reasonString + client; 
    var template = Enum.GetNames(typeof(TextTemplateTypeEnum)) 
       .Where(x => x.Contains(enumToSearch)) 
       .OrderByDescending(o => o.Substring(o.Length - 1, 1)) 
       .FirstOrDefault(); 

    if (template == null) 
    { 
     template = Enum.GetNames(typeof(TextTemplateTypeEnum)) 
         .Where(x => x.StartsWith(reasonString) && x[reasonString.Length]=='V') 
         .OrderByDescending(o => o.Substring(o.Length - 2, 2)) 
         .FirstOrDefault(); 
    } 

    return (TextTemplateTypeEnum)Enum.Parse(typeof(TextTemplateTypeEnum), template); 
} 

使用法:

string client = "Tesco"; 
ReasonEnum reason = ReasonEnum.NewStore; 
TextTemplateTypeEnum t = GetTemplate(client, reason); 

これは私がバージョンのために、少なくとも2桁を使用することが提案理由です、上の10からのバージョンで失敗するでしょう。

+0

はクライアントとその理由を見つける必要があります。 NewStoreV1&NewStoreTescoV1のように、理由と顧客名を考慮する必要があり、長さを固定する必要があります。バージョンについてのポイントは重要なものです –

+0

だから、このコードを試しましたか?それはあなたのために働くのですか? – Pikoh

+0

私は分かりません。私はあなたの 'TextTemplateTypeEnum'を使ってこのコードを試してみました。クライアントとして 'Tesco'を使用して(BookingConfirmationTescoV2を返す)、Waitroseを使って(BookingConfirmationV3を返すように)正しく動作します。たぶんあなたがここに示したコードとあなたの実際のコードとの間に違いがあるかもしれません... – Pikoh

関連する問題