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

mac*_*a18 2 c# string mapping design-patterns

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

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

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

例如

我的系统的状态值是

{Pending,Booked,Arrived,InProgress,Complete}

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

{Unknown,Pending,Booked,Accepted,Arrived,POB,Complete}

外部系统B可能具有以下值

{Waiting,Booked,Arrived,InProgress,Complete}

等等

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

例如.

对于外部系统A.

未知,待定 - >待定

已预订,已接受 - >已预订

到了,POB - > InProgress

完成 - >完成

对于外部系统B.

等待 - >等待

预订 - >预订,

到了,InProgress - > InProgress

完成 - >完成

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

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

有什么建议?

Gar*_*ill 7

听起来你需要一个Dictionary有效的查找:

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

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

public string MapState(IDictionary<string, string> mapping, string externalState)
{
    return mapping[externalState];
}
Run Code Online (Sandbox Code Playgroud)

从而:

var state = MapState(mappingA, "Accepted");
Run Code Online (Sandbox Code Playgroud)

......将返回"预订".

当然,如果外部状态不在预期值列表中,您需要处理应该发生的事情等.

我想你也可以通过从映射字典中排除"标准"值来节省一些重复,如果输入不是那些标准值之一,则只能求助于字典.也许用一个Hashtable.

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