簡體   English   中英

如何遍歷一組參數並使它們彼此關聯

[英]How to loop through an array of parameters and relate them to each other

我試圖遍歷一系列參數,並按它們遍歷的順序將它們與另一個參數關聯(該類的類型為Payment類型,屬性類型SupplementalPayment也類型為Payment)。 因此,對於4次付款,付款4將與付款3相關聯,付款3將與付款2相關聯,依此類推。

我無法使其使用無限數量的參數來做到這一點。

這就是我現在使用的方法的位置:

private Payment SortPayments(params Payment[] payments)
    {
        Payment parentPayment, lastPayment;

        lastPayment = parentPayment = null;

        foreach (Payment currentPayment in payments)
        {
            if (currentPayment != null)
            {
                lastPayment = currentPayment;

                if (parentPayment == null)
                {
                    parentPayment = lastPayment;
                }
                else if(parentPayment.SupplementalPayment == null)
                {
                    parentPayment.SupplementalPayment = lastPayment;
                }
                else if (parentPayment.SupplementalPayment.SupplementalPayment == null)
                {
                    parentPayment.SupplementalPayment = lastPayment;
                }
                else if (parentPayment.SupplementalPayment.SupplementalPayment.SupplementalPayment == null)
                {
                    parentPayment.SupplementalPayment.SupplementalPayment.SupplementalPayment = lastPayment;
                }
            }
        }

        return parentPayment;
    }

如您所見,它不是動態的,最多只能進行四次補充付款。 任何人都知道如何去做嗎?

也許我根本不理解您的問題,但您只是想將每筆付款與下一筆付款聯系起來。 在這種情況下,一個簡單的for循環就足夠了:

private Payment SortPayments(params Payment[] payments)
{
    if(payments.Length == 0) return null;

    for(int i = 0; i < payments.Length - 1; i++)
        payments[i].SupplementalPayment = payments[i + 1]

    return payments[0];
}

除了使用支付陣列之外,您還可以使用LinkedList<Payments>

這樣,您可以遍歷集合並將“上一個”節點分配給補充“付款”屬性。

鏈表

鏈表節點

也許您可以使用循環執行以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Payments
{
    class Program
    {
        static void Main(string[] args)
        {
            Payment p1 = new Payment();
            Payment p2 = new Payment();
            Payment p3 = new Payment();

            Payment Sorted = SortPayments(p1, p2, p3);
        }

        static private Payment SortPayments(params Payment[] payments)
        {
            if(payments.Length == 0)
            {
               return null;
            }

            Payment FirstPayment = payments[0];

            Payment current = FirstPayment;
            for (int i = 1; i < payments.Length; i++ )
            {
                current.SupplementalPayment = payments[i];
                current = current.SupplementalPayment;
            }

            return FirstPayment;
        }
    }
}

有無數種方法。 首先想到的是遞歸和有效參數的堆棧(可能不是遙不可及的)。 只需將數據整理到一個列表列表中即可。 遞歸函數“訪問”遍歷一個列表,將元素壓入堆棧,並調用訪問下一個列表,直到沒有要訪問的列表為止。 最后,您將獲得一系列相關元素。

重復調用后,您將從堆棧中彈出。 這需要打磨,但是您知道了。

謝謝你們的反饋。 這就是我最終得到的。 唯一的區別是答案是輸入的某些參數為空。

    private Payment SortPayments(params Payment[] payments)
    {
        for (int i = 0; i < payments.Length - 1; i++)
        {
            if (payments[i + 1] != null)
            {
                payments[i].SupplementalPayment = payments[i + 1];
            }
            else
            {
                int j = 1;
                while (true)
                {
                    if (payments[i + j] == null)
                    {
                        j++;
                    }
                    else
                    {
                        payments[i].SupplementalPayment = payments[i + j];
                        i += j;
                    }
                }
            }
        }

        return payments[0];
    }

暫無
暫無

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

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