【问题标题】:How to simplify if condition and foreach condition in c#.net?如何简化 c#.net 中的 if 条件和 foreach 条件?
【发布时间】:2020-12-02 01:45:52
【问题描述】:

我的控制器中有一个重复的 foreach 条件。我怎样才能简化它? 因此,我几乎达到了 500 行。我一直在 x8 的每个条件下使用它。

List<jewelry_dashboard_view_per_month> transactionmonthlynewloan = dashboardmanager.Get_MonthlyTransaction(search_branch, (monthlyonly + "01"), "N-", (monthlyonly + no_of_items), no_of_items, monthlyonly);
myNewLoanMontlyList.Add(transactionmonthlynewloan);

List<jewelry_dashboard_view_per_month> transactionmonthlyrenewal = dashboardmanager.Get_MonthlyTransaction(search_branch, (monthlyonly + "01"), "R-", (monthlyonly + no_of_items), no_of_items, monthlyonly);
myRenewalMontlyList.Add(transactionmonthlyrenewal);

这是if条件

if (myNewLoanMontlyList[0].Count != 0)
{
    foreach (var internal_monthly_newloan_data in myNewLoanMontlyList[0].SelectMany(c => c.id_data))
    {monthly_newloan_data_ID.Add(internal_monthly_newloan_data);}

    foreach (var internal_monthly_newloan_data in myNewLoanMontlyList[0].SelectMany(c => c.debit_data))
    {monthly_newloan_data_debit.Add(internal_monthly_newloan_data);}
}
else
{
    monthly_newloan_data_ID.Add(0);
    monthly_newloan_data_debit.Add(0);
};

这是 foreach 条件

//newloan
int newloan_data_id = 0;
DateTime newloan_data_transdate = DateTime.Parse((DateTime.Today).ToString());
decimal newloan_data_debit = 0;
string newloan_data_txnname = "";
string newloan_data_branchID = "";
foreach (var newloan_data in newloan)
{
    newloan_data_id = newloan_data.ID;
    newloan_data_transdate = DateTime.Parse((newloan_data.Transdate).ToString());
    newloan_data_debit = Decimal.Parse((newloan_data.Debit).ToString());
    newloan_data_txnname = newloan_data.TransactionName;
    newloan_data_branchID = newloan_data.BranchID;
};
datanewloan = new transaction_details()
{
    ID = newloan_data_id,
    Transdate = DateTime.Parse(newloan_data_transdate.ToString("yyyy-MM-dd")),
    Debit = Decimal.Parse(newloan_data_debit.ToString()),
    TransactionName = newloan_data_txnname,
    BranchID = newloan_data_branchID
};

【问题讨论】:

    标签: c# model-view-controller foreach model


    【解决方案1】:

    你可以使用Linq

    SelectMany: 将序列的每个元素投影到IEnumerable&lt;T&gt;。您无需再次迭代并将其添加到单独的列表中

    对于你的 if 条件,

    if (myNewLoanMontlyList[0].Any())
    {
        monthly_newloan_data_ID = myNewLoanMontlyList[0].SelectMany(c => c.id_data);
        monthly_newloan_data_debit = myNewLoanMontlyList[0].SelectMany(c => c.debit_data);
    }
    else
    {
        monthly_newloan_data_ID.Add(0);
        monthly_newloan_data_debit.Add(0);
    }
    

    Select: 将序列的每个元素投影到新的形式中。在你的 案例新形式是transaction_details的实例

    使用 Linq .Select() 代替 for 循环,

    var result = newloan.Select(x => new transaction_details(){
              ID = x.ID,
              Transdate = DateTime.Parse(x.Transdate.ToString("yyyy-MM-dd")),
              Debit = Decimal.Parse((x.Debit).ToString()),
              TransactionName = x.TransactionName,
              BranchID =  x.BranchID
    }).LastOrDefault();
    

    为了获取最后一个元素,我使用了LastOrDefault()。您可以通过索引或条件获取单个元素。

    【讨论】:

    • @DamHarvey,它回答了你的问题吗?有帮助吗?
    • 无法将 System.Collection.List 转换为 transaction_details。
    • @DamHarvey,我们可以使用 LastOrDefault 获取单个 transaction_details 对象。您也可以使用索引来完成。我更新了我的答案。请检查
    【解决方案2】:

    在您的if-else 条件下:

    if (myNewLoanMontlyList[0].Count != 0)
    {
        foreach (var internal_monthly_newloan_data in myNewLoanMontlyList[0].SelectMany(c => c.id_data))
        {monthly_newloan_data_ID.Add(internal_monthly_newloan_data);}
    
        foreach (var internal_monthly_newloan_data in myNewLoanMontlyList[0].SelectMany(c => c.debit_data))
        {monthly_newloan_data_debit.Add(internal_monthly_newloan_data);}
    }
    else
    {
        monthly_newloan_data_ID.Add(0);
        monthly_newloan_data_debit.Add(0);
    };
    

    如果方法中if-else之后没有其他进程,则可以只使用if条件,不带else部分。

        if (myNewLoanMontlyList[0].Count == 0)
        {
           monthly_newloan_data_ID.Add(0);
           monthly_newloan_data_debit.Add(0);
        }
    
        foreach (var internal_monthly_newloan_data in myNewLoanMontlyList[0].SelectMany(c => c.id_data))
        {monthly_newloan_data_ID.Add(internal_monthly_newloan_data);}
    
        foreach (var internal_monthly_newloan_data in myNewLoanMontlyList[0].SelectMany(c => c.debit_data))
        {monthly_newloan_data_debit.Add(internal_monthly_newloan_data);}
    

    【讨论】:

    • 还是一个漫长的过程。需要一个更短的。
    • 优化取决于逻辑和需求。如果某些条件是必须要提出的,那么它们是必须要执行的。没有解决办法省略 main if-else
    • ok2x。如果没有解决方案,我可能会坚持使用 if-else 和 foreach
    猜你喜欢
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多