用于将一个字符串值映射到另一个字符串

时间:2015-09-22 10:21:34

标签: c# string design-patterns mapping

我正在使用多个外部系统,所有外部系统都返回一个状态属性。

此状态属性在外部系统之间可以是不同的值,但必须映射到系统上的特定状态值。

我有一个单独的类(适配器)来处理每个外部系统

e.g

我的系统的状态值是

{   待定,   预订,   赶到时,   进行中,   完成 }

现在外部系统A 可能具有以下值

{   未知,   待定,   预订,   公认,   赶到时,   POB,   完成 }

外部系统B 可能包含以下值

{   等候,   预订,   赶到时,   进行中,   完成 }

等等

现在我需要将外部系统值映射到我的系统值。

例如

外部系统A

未知,待定 - >未决

预订,接受 - >被预订

到达,POB - > INPROGRESS

完成 - >完整

外部系统B

等待 - >未决

预订 - >被预订,

到达,InProgress - > INPROGRESS

完成 - >完整

现在我已经将这个抽象为一个辅助方法MapState,每个适配器使用它来获取状态值。此方法具有字符串参数externalsystem和externalsystemstate,并使用switch语句将外部系统状态映射到我的系统状态。

我认为这非常简单,我相信有一个更优雅的解决方案

有什么建议吗?

3 个答案:

答案 0 :(得分:7)

听起来您需要Dictionary才能进行有效查找:

var mappingA = new Dictionary<string, string>()
{
    { "Unknown", "Pending" },
    { "Pending", "Pending" },
    { "Booked", "Booked" },
    { "Accepted", "Booked" },
    { "Arrived", "InProgress" },
    { "POB", "InProgress" },
    { "Complete", "Complete" }
};

...然后您的映射函数可以引用相应的字典:

public string MapState(IDictionary<string, string> mapping, string externalState)
{
    return mapping[externalState];
}

因此:

var state = MapState(mappingA, "Accepted");

...将返回&#34;预订&#34;。

当然,您想要处理如果外部状态不在预期值列表中会发生什么等。

我想你也可以通过排除&#34;标准&#34;来节省一些重复。来自映射字典的值,并且如果输入不是这些标准值之一,则仅求助于字典。也许可以使用Hashtable

我认为我很想使用enum来表示已解析的值。这样,在测试状态时,下游代码中的字符串操作较少。您可以在需要时使用ToString()轻松转换回字符串。

答案 1 :(得分:0)

我之前使用过的方法是创建XML映射文件,这些文件在运行时加载,然后用于将一个值映射到另一个值。例如,您可以:

var old_form_action = $('#formname').attr('action');
var new_form_action = old_form_action.replace(/(page=)[^\&]+/, '$1' + '0');
$('#formname').attr('action', new_form_action);

这将处理一个映射到“待定”的情况,这也具有可以由非技术用户在程序外更改的优点。缺点是您需要知道所有可能的传入类型,以便为它们创建映射。

在您的代码中,您可以使用XML解析器加载映射,然后查找传入的字符串并查找正确的属性并输出内部值。

答案 2 :(得分:0)

你需要

enum State { Pending, Booked, Arrived, InProgress, Complete }

中的任何一个:

enum StateA { Unknown, Pending, Booked, Accepted, Arrived, POB, Complete }
enum StateB { Waiting, Booked, Arrived, InProgress, Complete }

然后它就像转换方法一样简单(不是真正的映射):

State Convert(StateA a)
{
     switch(a)
     {
         case StateA.Unknown:
         case StateA.Pending:
             return State.Pending;
         ...
     }
}

State Convert(StateB b)
{
     ...
}

在使用State的相同范围内定义这些方法。