C# : IF ELSE replacement



在应用程序中有3个方法,在方法中有更新/插入查询。方法是相互依赖的。如果第一个方法成功运行,则调用第二个方法;第二个运行成功-第三个被调用。

这是我写的代码

DataContext类

using System;
using System.Collections.Generic;
using System.Text;
using Dapper;
using System.Data.SqlClient;
using System.Data;
namespace DataAccessEntity.DbContext
{
public class DataContext
{
static SqlConnection con;
static SqlTransaction tran;

public static SqlTransaction StartTransaction()
{
return con.BeginTransaction();
}
public static void RollBackTransaction()
{
tran.Rollback();
}
public static void CommitTransaction()
{
tran.Commit();
}
public static int ExecuteSql(string sql,string connectionstring,DynamicParameters param)
{
int result = 0;
try
{
using (con = new SqlConnection(connectionstring))
{
if (con.State.Equals(ConnectionState.Closed))
con.Open();
tran = StartTransaction();
result = 
con.Execute(sql,null,tran,0,CommandType.Text);
CommitTransaction();
con.Close();
}
}
catch (Exception ex)
{
RollBackTransaction();
throw ex;
}
finally
{
con.Close();
}

return result;
}
public static DataTable ExecuteToDataTable(string sql, string connectionstring, DynamicParameters param, SqlTransaction tran)
{
DataTable dt = null;
using (con = new SqlConnection(connectionstring))
{
if (con.State.Equals(ConnectionState.Closed))
con.Open();
var result = con.ExecuteReader(sql, null, null, 0, CommandType.Text);
dt = new DataTable();
dt.Load(result);
con.Close();
}
return dt;
}
}
}

DataAccessEntity

using System;
using System.Data.SqlClient;
using System.Data;
using Microsoft.Extensions.Configuration;
using DataAccessEntity.DbContext;
namespace DataAccessEntity
{
public class CountryDE
{
static string connectionstring;
public static int UpdateCountry(IConfiguration _iconfiguration)
{
try
{
connectionstring = _iconfiguration.GetConnectionString("Default");
string sql = "Update tb_country set country='Spain' where id=1;Update tb_country set country='USA' where id=2;Update tb_country set country='USA' where id=13;Update tb_country set country='USA' where id=14;Update tb_country set country='USA' where id=15;Update tb_country set country='USA' where id=16";
int result = DataContext.ExecuteSql(sql, connectionstring, null);
return result;
}
catch(Exception ex)
{
throw ex;
}
}
public static int AddCountries(IConfiguration _iconfiguration)
{
try
{
connectionstring = _iconfiguration.GetConnectionString("Default");
string sql = "insert into tb_country(country,active) values ('Argentina',1)";
int result = DataContext.ExecuteSql(sql, connectionstring, null);
return result;
}
catch (Exception ex)
{
throw ex;
}
}
public static DataTable GetCountry(IConfiguration _iconfiguration)
{
try
{
connectionstring = _iconfiguration.GetConnectionString("Default");
string sql = "Select id,country,active from tb_country";
DataTable dt = DataContext.ExecuteToDataTable(sql, connectionstring, null, null);
return dt;
}
catch(Exception ex)
{
throw ex;
}
}
}
}

BusinessEntity

using System;
using DataAccessEntity;
using Microsoft.Extensions.Configuration;
using UtilityEntity;
using System.Data;
using System.Reflection;
namespace BusinessEntity
{
public class CountryBE
{
public static int UpdateCountry(IConfiguration _iconfiguration)
{
int result = 0;
try
{
Logger.LogMessage(MethodBase.GetCurrentMethod().Name + "" + "Started");
result = CountryDE.UpdateCountry(_iconfiguration);
}
catch (Exception ex)
{
Logger.LogException(ex.Message);
}
return result;
}
public static int AddCountries(IConfiguration _iconfiguration)
{
int result = 0;
try
{
Logger.LogMessage(MethodBase.GetCurrentMethod().Name + "" + "Started");
result = CountryDE.AddCountries(_iconfiguration);
}
catch (Exception ex)
{
Logger.LogException(ex.Message);
}
return result;
}
public static DataTable GetCountry(IConfiguration _iconfiguration)
{
try
{
Logger.LogMessage(MethodBase.GetCurrentMethod().Name + "" + "Started");
DataTable dt = CountryDE.GetCountry(_iconfiguration);
return dt;
}
catch (Exception ex)
{
throw ex;
}
}
}
}

主要Program.cs

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System;
using System.IO;
using DataModelEntity;
using UtilityEntity;
using BusinessEntity;
using System.Data;
using Microsoft.Extensions.DependencyInjection;
using NLog.Extensions.Logging;
namespace ConsoleApp1
{
class Program
{
private static IConfiguration _iconfiguration;
static void Main(string[] args)
{
GetAppSettingsFile();
var servicesProvider = BuildDi(_iconfiguration);
using(servicesProvider as IDisposable)
{
servicesProvider.GetRequiredService<Logger>();
}
UpdateCountries();

}
public static IServiceProvider BuildDi(IConfiguration config)
{
return new ServiceCollection()
.AddTransient<Logger>().
AddLogging(loggingBuilder =>
{
loggingBuilder.ClearProviders();
loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Information);
loggingBuilder.AddNLog(config);
}).BuildServiceProvider();
}
static void GetAppSettingsFile()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
_iconfiguration = builder.Build();
}

static void UpdateCountries()
{
int result = CountryBE.UpdateCountry(_iconfiguration);

if(result > 0)
{
AddCountries();
}
else
{
Console.WriteLine("Not Updated");
}
}
static void AddCountries()
{
int result = CountryBE.AddCountries(_iconfiguration);

if(result > 0)
{
GetCountryDetails();
}
else
{
Console.WriteLine("Not Updated");
}
}
static void GetCountryDetails()
{
Console.WriteLine("Get Countries");
DataTable dt = CountryBE.GetCountry(_iconfiguration);
foreach(DataRow dr in dt.Rows)
{
Console.WriteLine(dr["country"].ToString());
}
Console.WriteLine("Press any key to stop.");
Console.ReadKey();
}
}
}

与Program.cs中一样,如果使用else,我想写同样的代码,不使用if语句,切换大小写或三元操作符。请指导我如何做这件事。

@Tarik的答案很简单,也很有效,我同意。

还有其他方法。
例如,您可以为每个方法创建一个Task,并使用c# TPL提供的多个选项之一(例如,continuations)

另一个简单的方法是使用短路条件操作符,如下所示:
return cmd.ExecuteNonQuery1() > 0
&& cmd.ExecuteNonQuery2() > 0
&& cmd.ExecuteNonQuery3() > 0
&& cmd.ExecuteNonQuery4() > 0;

我将首先更改方法签名以返回result

你可以声明和数组Func<int>methods,并将其初始化为Method1, Method2,…

你只需要一个循环:

foreach (method in methods) {
if (method() == 0)
break; // or any other action.
}

可以添加代码来处理错误。

为了给你另一个想法,我建议你看看函数式编程你可以在我对类似问题的回答中找到类似的方法。基本上,您可以为if语句引入一个方法,并在需要时重用该方法。这样,您就不会有您想要的if语句,并且将逻辑写在一个地方。例如,你可以有这样一个方法:

private static bool ExecuteIfTrue(this bool nonQueryResult, Func<int> nonQueryAction, Action actionToInvoke)
{
if (nonQueryResult && nonQueryAction() > 0)
{
actionToInvoke();
return true;
}
return false;
}

然后用函数式编程风格将你的方法和if语句链接起来:

var initialResult = ExecuteNonQuery() > 0;
initialResult.ExecuteIfTrue(ExecuteNonQuery, Method1)
.ExecuteIfTrue(ExecuteNonQuery, Method2)
.ExecuteIfTrue(ExecuteNonQuery, Method3)
// ......
;

最新更新