2014-01-08 21 views
1

我試圖通過params數組循環並將它們與另一個循環中的順序相關聯(類爲付款與財產SupplementalPayment也類型付款)。 因此,如果有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; 
    } 

正如你可以看到它不是動態的,只會做最多四個supplementalpayments。任何人有任何想法如何去做這件事?

+0

您可能正在使用while循環 –

回答

1

也許你可以做這樣的事情,使用一個循環:

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; 
     } 
    } 
} 
+0

我嘗試過使用while循環,但沒有弄清楚它的意思。無論如何,您發佈的代碼永遠不會啓動while循環,因爲parentpayment從未獲得過補充付款。 – RichardMc

+0

@RichardMc - 我還沒有測試過,它只是一個提示如何開始。 –

+0

現在它已經過測試並且可以正常工作。 (我希望我有你的意圖。) –

0

有沒有無限的方法如何做到這一點。 我想到的第一件事(可能不是最優化的)是遞歸和活動參數堆棧。 只需將您的數據組織到列表中。遞歸函數「訪問」遍歷一個列表,將元素推入堆棧並調用下一個列表的訪問,直到沒有列表訪問。最後你有一堆相關的元素。

重複呼叫後,您從堆棧彈出。 這需要拋光,但你明白了。

1

而不是使用支付數組時,也許你可以使用一個LinkedList<Payments>來代替。

這種方式,您可以循環通過收集和分配上的節點,以補充付款財產。

LinkedList

LinkedListNode

2

也許我不理解你的問題在所有,但你只是試圖鏈接每次支付給下一個。在這種情況下,一個簡單的循環就足夠了:

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]; 
} 
+0

我也是這樣。理查德,這是你想要做的? –

0

感謝您的反饋球員。這是我結束了。 唯一的區別是答案是它佔一些參數輸入爲空。

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]; 
    } 
相關問題