Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将一个字符串值映射到另一个字符串值的优雅解决方案_C#_String_Design Patterns_Mapping - Fatal编程技术网

C# 将一个字符串值映射到另一个字符串值的优雅解决方案

C# 将一个字符串值映射到另一个字符串值的优雅解决方案,c#,string,design-patterns,mapping,C#,String,Design Patterns,Mapping,我正在使用多个外部系统,所有这些系统都返回一个状态属性 此状态属性可以是外部系统之间的不同值,但必须映射到我的系统上的特定状态值 我有一个单独的类(适配器)来处理每个外部系统 e、 g 我的系统的状态值为 { 悬而未决的 预订, 到了, 在进展中, 完成 } 现在,外部系统A可能具有以下值 { 不详, 悬而未决的 预订, 认可的, 到了, POB, 完成 } 外部系统B可能具有以下值 { 等待, 预订, 到了, 在进展中, 完成 } 等等等等 现在我需要将外部系统值映射到我的系统值 例如 对于外

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

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

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

e、 g

我的系统的状态值为

{ 悬而未决的 预订, 到了, 在进展中, 完成 }

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

{ 不详, 悬而未决的 预订, 认可的, 到了, POB, 完成 }

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

{ 等待, 预订, 到了, 在进展中, 完成 }

等等等等

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

例如

对于外部系统A

未知,挂起->挂起

预订,接受->预订

到达,POB->正在进行

完成->完成

对于外部系统B

等待->待定

预订->预订

到达,正在进行->正在进行

完成->完成

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

我认为这是一个非常简单的解决方案,而且肯定有一个更优雅的解决方案


有什么建议吗?

听起来你需要一本
字典来高效查找:

var mappingA = new Dictionary<string, string>()
{
    { "Unknown", "Pending" },
    { "Pending", "Pending" },
    { "Booked", "Booked" },
    { "Accepted", "Booked" },
    { "Arrived", "InProgress" },
    { "POB", "InProgress" },
    { "Complete", "Complete" }
};
…将返回“已预订”

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

我想您还可以通过从映射字典中排除“标准”值来避免一些重复,并且仅当输入不是这些标准值之一时才求助于字典。也许可以使用一个
哈希表


不过,我想我会尝试使用
enum
来表示解析后的值。这样,在测试状态时,下游代码中的字符串操作就更少了。使用
ToString()

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

<Input Name="Unknown">
    <Output>Pending</Output>
</Input>
<Input Name="Pending">
    <Output>Pending</Output>
</Input>
<Input Name="Waiting">
    <Output>Pending</Output>
</Input>

悬而未决的
悬而未决的
悬而未决的
这将处理一个映射到“挂起”的情况,这还有一个优点,即非技术用户可以在程序之外对其进行更改。缺点是您需要知道所有可能的传入类型才能为它们创建映射

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

您需要

enum State { Pending, Booked, Arrived, InProgress, Complete }
其中一项:

enum StateA { Unknown, Pending, Booked, Accepted, Arrived, POB, Complete }
enum StateB { Waiting, Booked, Arrived, InProgress, Complete }
然后它就像转换方法一样简单(不是真正的映射):

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

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)
{
     ...
}