2014-01-08 2 views
1

Я пытаюсь перебрать массив параметров и связать их с другим в том порядке, в котором они зацикливаются (класс имеет тип Оплата с имуществом 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

Вы можете использовать в то время цикл –

ответ

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, поскольку родительский платеж еще не получил дополнительный платеж. – 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

Спасибо за отзыв ребята. Это то, чем я закончил. Единственное отличие от ответов заключается в том, что некоторые из параметров введены как null.

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]; 
    } 
Смежные вопросы