解决  我如何重构if..else if - 如果多个条件

Palak Shah.

众所周知的成员
加入
4月29日,2020年4月
消息
83
编程经验
1-3
大家好,

我有一个类文件,如果否则,如果在多个条件下,我感觉到类文件真的很困惑,那么如果我能重新推荐任何方式的代码,你可以帮我吗?


Class File:
public static PaymentOptions GetPaymentOptions_Auto(TestConfigurationCDO testConfiguration, int siteId)
        {
            var paymentOptions = new PaymentOptions();

            var paymentOptionList = SitePaymentRepository.GetSitePaymentInfoBySiteId(
                testConfiguration,
                siteId);

            var lowestPriority = paymentOptionList.Min(x => x.Priority);
            var paymentAuto = paymentOptionList.Where(x => x.Priority == lowestPriority).FirstOrDefault();
            
            if (paymentAuto.PaymentType == PaymentMethod.Klarna)
            {
                paymentOptions = new KlarnaOptions();
            }
            else if (paymentAuto.PaymentType == PaymentMethod.PayPalDirect ||
                paymentAuto.PaymentType == PaymentMethod.Braintree ||
            paymentAuto.PaymentType == PaymentMethod.BankTransfer || paymentAuto.PaymentType == PaymentMethod.AdyenDropIn)
            {
                paymentOptions = new ClientCheckoutOptions()
                {
                    paymentMethod = paymentAuto.PaymentType
                };
            }
            else if (paymentAuto.PaymentType == PaymentMethod.PayPalExpress)
            {
                paymentOptions = new PaypalOptions();
            }
            else
            {
                paymentOptions = new PaypalOptions();
            }
            return paymentOptions;
        }
 
Solution
Switch Case帮助我清理我的代码:


Updated Code:
public static PaymentOptions GetPaymentOptions_Auto(TestConfigurationCDO testConfiguration, int siteId)
        {
            var paymentOptionList = SitePaymentRepository.GetSitePaymentInfoBySiteId(
                testConfiguration,
                siteId);

            var lowestPriority = paymentOptionList.Min(x => x.Priority);
            var paymentAuto = paymentOptionList.FirstOrDefault(x => x.Priority == lowestPriority);

            PaymentOptions...

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,159
地点
挪威
编程经验
10+

Palak Shah.

众所周知的成员
加入
4月29日,2020年4月
消息
83
编程经验
1-3
Switch Case帮助我清理我的代码:


Updated Code:
public static PaymentOptions GetPaymentOptions_Auto(TestConfigurationCDO testConfiguration, int siteId)
        {
            var paymentOptionList = SitePaymentRepository.GetSitePaymentInfoBySiteId(
                testConfiguration,
                siteId);

            var lowestPriority = paymentOptionList.Min(x => x.Priority);
            var paymentAuto = paymentOptionList.FirstOrDefault(x => x.Priority == lowestPriority);

            PaymentOptions paymentOptions;

            switch (paymentAuto.PaymentType)
            {
                case PaymentMethod.PayPalDirect:
                case PaymentMethod.Braintree:
                case PaymentMethod.BankTransfer:
                case PaymentMethod.AdyenDropIn:
                    paymentOptions = new ClientCheckoutOptions()
                    {
                        paymentMethod = paymentAuto.PaymentType
                    };
                    break;

                case PaymentMethod.Klarna:
                    paymentOptions = new KlarnaOptions();
                    break;

                case PaymentMethod.PayPalExpress:
                default:
                    paymentOptions = new PaypalOptions();
                    break;
            }

            return paymentOptions;
        }
 
解决方案

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,159
地点
挪威
编程经验
10+
如果您使用C#7.3(.NET Framework项目),我链接的切换表达式不可用,很高兴您找到了切换语句很有用。
作为一个例子,我安排了您发布到表达式的代码,我不知道您拥有的枚举或类型,因此可能有不同的方式排列。
C#:
PaymentMethod[] checkoutGroup = { PaymentMethod.PayPalDirect, PaymentMethod.Braintree, PaymentMethod.BankTransfer, PaymentMethod.AdyenDropIn };

return paymentAuto.PaymentType switch
{
    var v when checkoutGroup.Contains(v) => new ClientCheckoutOptions() { paymentMethod = v },
    PaymentMethod.Klarna => new KlarnaOptions(),
    PaymentMethod.PayPalExpress => new PaypalOptions(),
    _ => new PaypalOptions()
};
 

Palak Shah.

众所周知的成员
加入
4月29日,2020年4月
消息
83
编程经验
1-3
如果您使用C#7.3(.NET Framework项目),我链接的切换表达式不可用,很高兴您找到了切换语句很有用。
作为一个例子,我安排了您发布到表达式的代码,我不知道您拥有的枚举或类型,因此可能有不同的方式排列。
C#:
PaymentMethod[] checkoutGroup = { PaymentMethod.PayPalDirect, PaymentMethod.Braintree, PaymentMethod.BankTransfer, PaymentMethod.AdyenDropIn };

return paymentAuto.PaymentType switch
{
    var v when checkoutGroup.Contains(v) => new ClientCheckoutOptions() { paymentMethod = v },
    PaymentMethod.Klarna => new KlarnaOptions(),
    PaymentMethod.PayPalExpress => new PaypalOptions(),
    _ => new PaypalOptions()
};
啊啊......我找到了一种实现的新方式..谢谢你这么多来告诉我 @Johnh. 🙏

我想我也可以使用它8.0版(4.8框架)
 
Last edited:

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,893
地点
切萨皮克,va.
编程经验
10+
投资副本"Effective C#" and "More Effective C#"永远不会浪费金钱。我不知道该语言最新版本封面的版本,但我购买的这本书的过去版本具有相同的深度和质量作为优秀"Effective C++" and "More Effective C++" series of books.
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,159
地点
挪威
编程经验
10+

Palak Shah.

众所周知的成员
加入
4月29日,2020年4月
消息
83
编程经验
1-3
不在.NET Framework中,.NET Core 3和.NET 5支持C#8.0,请参阅 C#语言版本控制 - C#指南
如果您正在调查新的C#功能,请检查这些文章: C#8.0 - C#指南中的新功能C#9.0 - C#指南中的新功能
我仍然对语言版本部分(Facepalm)混淆

下面是我的框架项目文件看起来像,播放它支持c#8.0功能?


Project File:
<PropertyGroup>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>Framework</RootNamespace>
    <AssemblyName>Framework</AssemblyName>
    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <SkipPostSharp>True</SkipPostSharp>
    <TargetFrameworkProfile />
    <NuGetPackageImportStamp>
    </NuGetPackageImportStamp>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <LangVersion>8.0</LangVersion>
  </PropertyGroup>
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,159
地点
挪威
编程经验
10+
不,那是和"old"框架项目,最后一个是.NET 4.8为此。
 
最佳 底部