簡體   English   中英

用於將一個字符串值映射到另一個字符串

[英]elegant solution for mapping one string value to another

我正在使用多個外部系統,所有這些系統都返回一個狀態屬性。

此狀態屬性可以是外部系統之間的不同值,但必須映射到系統上的特定狀態值。

我有一個單獨的類(適配器)來處理每個外部系統

例如

我的系統的狀態值是

{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語句將外部系統狀態映射到我的系統狀態。

我認為這非常簡單,我相信有更優雅的解決方案

有什么建議么?

聽起來你需要一個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");

......將返回“預訂”。

當然,如果外部狀態不在預期值列表中,您需要處理應該發生的事情等。

我想你也可以通過從映射字典中排除“標准”值來節省一些重復,如果輸入不是那些標准值之一,則只能求助於字典。 也許使用Hashtable

不過,我認為我很想使用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 Convert(StateA a)
{
     switch(a)
     {
         case StateA.Unknown:
         case StateA.Pending:
             return State.Pending;
         ...
     }
}

State Convert(StateB b)
{
     ...
}

在使用State的相同范圍內定義這些方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM