gpt4 book ai didi

c# - 使用特定于枚举的方法将枚举映射到函数/操作

转载 作者:太空狗 更新时间:2023-10-29 20:46:03 25 4
gpt4 key购买 nike

我在在线预订网站(航空公司)上工作,我想根据某些设置验证用户/客户选择的路线是否有效。现有代码使用了大量枚举,我发现自己做了很多 if/if else/else 来将特定枚举映射到我想要发生的特定操作。 我想做的是编写一个特定于枚举的方法来为我进行映射。有什么标准的方法可以做到这一点吗?

这是应用程序代码的简化版本,使用与真实应用程序相同的类名/枚举值等:

// real app has 9 members, shortened for simplicity's sake
public enum RegionType
{
Station,
Country,
All
}

public enum Directionality
{
Between,
From,
To
}

// simplified version
public class Flight
{
public RegionType RegionType { get; set; }
public RegionType TravelRegionType { get; set; }
public string RegionCode { get; set; }
public string TravelRegionCode { get; set; }
public string RegionCountryCode { get; set; }
public string TravelRegionCountryCode { get; set; }
public Directionality Directionality { get; set; }
}

下面是一些示例用法:

    // valid flight
Flight flight = new Flight()
{
RegionCode = "NY",
CountryCode = "JP",
RegionType = RegionType.Station,
TravelRegionType = RegionType.Country,
Directionality = Directionality.Between
};

// these are the station code/country code that user selected
// needs to be validated against the Flight object above
var userSelectedRoutes = new List<KeyValuePair<string, string>>()
{
new KeyValuePair<string, string>("NY", "JP"),
new KeyValuePair<string, string>("NY", "AU"),
new KeyValuePair<string, string>("JP", "NY")
};

我写的一些代码验证是为了减少嵌套的 if/else if/else 枚举匹配:

private bool IsRouteValid(Directionality direction, string origin, 
string destination, string departure, string arrival)
{
// both departure station and arrival station
if (direction == Directionality.Between)
{
return (origin.Equals(departure, StringComparison.OrdinalIgnoreCase)
&& destination.Equals(arrival, StringComparison.OrdinalIgnoreCase)
|| origin.Equals(arrival, StringComparison.OrdinalIgnoreCase)
&& destination.Equals(departure, StringComparison.OrdinalIgnoreCase));
}
else if (direction == Directionality.From)
{
return (origin.Equals(departure,
StringComparison.OrdinalIgnoreCase));
}
else if (direction == Directionality.To)
{
return (destination.Equals(arrival,
StringComparison.OrdinalIgnoreCase));
}

return false;
}

这是我要更改的困惑代码:

if (flight.RegionType == RegionType.Station 
&& flight.TravelRegionType == RegionType.Country)
{
return userSelectedRoutes.Any(route =>
IsRouteValid(flight.Directionality, route.Key, route.Value,
flight.RegionCode, flight.TravelRegionCode));
}
else if (flight.RegionType == RegionType.Country
&& flight.TravelRegionType == RegionType.Station)
{
return userSelectedRoutes.Any(route =>
IsRouteValid(flight.Directionality, route.Key, route.Value,
flight.CountryCode, flight.RegionCode));
}
else if (flight.RegionType == RegionType.Station
&& flight.TravelRegionType == RegionType.Station)
{
return userSelectedRoutes.Any(route =>
IsRouteValid(flight.Directionality, route.Key, route.Value,
flight.RegionCode, flight.TravelRegionCode));
}
else if (flight.RegionType == RegionType.Station
&& flight.TravelRegionType == RegionType.All)
{
return userSelectedRoutes.Any(route =>
IsRouteValid(flight.Directionality, route.Key, route.Value,
flight.RegionCode, route.Value));
}
else if (flight.RegionType == RegionType.All
&& flight.TravelRegionType == RegionType.Station)
{
return userSelectedRoutes.Any(route =>
IsRouteValid(flight.Directionality, route.Key, route.Value,
route.Key, flight.TravelRegionCode));
}
else if (flight.RegionType == RegionType.All
&& flight.TravelRegionType == RegionType.All)
{
return true;
}
else
{
return false;
}

图例:

RegionCode = 出发站/出发地
TravelRegionCode = 到达站/目的地
Between = 路线必须仅来自给定的出发站和到达站,反之亦然(例如 NY-JP 或 JP-NY)
From = 从特定车站到任何路线(例如 AU-All)
To = 到特定车站的任何路线(例如 All-AU)

如果您注意到,上述所有条件中的 .Any 都相同,只是略有不同。如果可能的话,我想减少代码冗余。我使用了 KeyValuePair,所以我在单一数据类型上同时拥有出发站和到达站。

关于如何使这段代码不那么困惑/漂亮,有什么想法吗?我知道我也对 IsRouteValid() 进行了硬编码,但我 100% 确定 Directionality 只能有 3 种可能的组合。另一方面,RegionType 可以有多种组合,例如 Station-Station、Station-Country、Country-Station、Country-Country 等。

预期输出:

第一条路线(NY-JP)有效/真实
第二条路线 (NY-AU) 无效/错误
第三条路线 (JP-NY) 有效/真 [因为 DirectionalityBetween]

感谢您阅读这个非常长的查询,并提前感谢您的反馈和建议。

类似的帖子:

Enum and Dictionary

最佳答案

处理此类枚举 Action 映射的一种方法是使用字典。这是一个例子:

public enum MyEnum
{
EnumValue1,
EnumValue2,
EnumValue3
}

private IDictionary<MyEnum, Action> Mapping = new Dictionary<MyEnum, Action>
{
{ MyEnum.EnumValue1, () => { /* Action 1 */ } },
{ MyEnum.EnumValue2, () => { /* Action 2 */ } },
{ MyEnum.EnumValue3, () => { /* Action 3 */ } }
};

public void HandleEnumValue(MyEnum enumValue)
{
if (Mapping.ContainsKey(enumValue))
{
Mapping[enumValue]();
}
}

当然你也可以用Func代替Action来处理参数。

编辑:

由于您不仅要使用一个枚举,还要使用成对的枚举,因此您必须调整上面的示例,以处理 Tuple 或其他聚合枚举值的方法。

关于c# - 使用特定于枚举的方法将枚举映射到函数/操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14395147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com