2015-02-23 4 views
0

Не могли бы вы помочь мне рассчитать общую сумму каждого типа платежа, такого как визу, mastercard и paypal. Я создал интерфейс IPay и унаследовал его в классе Mastercard, Visa и PayPal. Он отображает информацию о каждом клиенте, а также количество заказов и тип оплаты. Мне нужно рассчитать Total Payment для каждого типа оплаты. Благодарю.C# Как рассчитать общее количество для каждого способа оплаты

public class Program 
{ 
public static void Main() 
{ 
    Customer[] custArray = new Customer[3]; 

    // First Customer 
    custArray[0] = new Customer() { FirstName = "Adam", LastName = "Miles", Orders = new Order[2] }; 
    custArray[0].Orders[0] = new Order() { Description = "Shoes", Price = 19.99M, Quantity = 1, Pay = new MasterCard() }; 
    custArray[0].Orders[1] = new Order() { Description = "Gloves", Price = 29.99M, Quantity = 2,Pay = new Visa() }; 

    // Second Customer 
    custArray[1] = new Customer() { FirstName = "Andrew", LastName = "Hart", Orders = new Order[2] }; 
    custArray[1].Orders[0] = new Order() { Description = "Jacket", Price = 39.99M, Quantity = 1,Pay = new MasterCard() }; 
    custArray[1].Orders[1] = new Order() { Description = "Socks", Price = 49.99M, Quantity = 1,Pay = new Paypal() }; 


    foreach (var customer in custArray) 
    { 
     if (customer == null) continue; 

     Console.WriteLine("Customer:\n"); 
     Console.WriteLine("{0, 15} {1, 17}", "First Name", "Last Name"); 
     Console.WriteLine("{0, 10} {1, 20}", customer.FirstName, customer.LastName); 
     Console.WriteLine("Orders:\n"); 

     foreach (var order in customer.Orders) 
     { 
      if (order == null) continue; 

      Console.WriteLine("{0, 10} {1, 10} {2, 10}{3, 15}", order.Description, order.Price, order.Quantity, order.Pay); 
      Console.WriteLine("\n\n"); 
      decimal total = order.Price * order.Quantity; 
      Console.WriteLine("Total :", total); 

      if (order.Pay== new MasterCard()) 
      { 
       total = total++; 
       Console.WriteLine("Visa Total", total); 
      } 

      else if (order.Pay == new Visa()) 
      { 
       total = total++; 
       Console.WriteLine("Visa Total", total); 
      } 

      else if (order.Pay == new MasterCard()) 
      { 
       total = total++; 
       Console.WriteLine("Visa Total", total); 
      } 

     } 
     Console.WriteLine("\n\n"); 


    } 



     Console.ReadLine(); 
    } 
} 

class Customer 
{ 
    public string FirstName; 
    public string LastName; 
    public Order[] Orders; 


} 
class Order 
{ 
    public string Description; 
    public decimal Price; 
    public int Quantity; 
    public IPay Pay; 
    // Payment type p=new pay 

} 
interface IPay 
{ 
    void PayType(); 
} 

class MasterCard : IPay 
{ 
    public void PayType { get; set; } 
} 

    class Paypal : IPay 
    { 
     public void PayType { get; set; } 
    } 
    public class Visa : IPay 
    { 
     public void PayType {get;set;} 

    }   
+4

Ваша проблема начинается тогда, когда вы делаете 'order.Pay == новый MasterCard()'. Я бы честно не решался иметь дело с реальными деньгами через код с таким уровнем программирования (честно говоря, без обид). – SimpleVar

+0

Есть больше проблем, чем это. Интерфейс декалируется с memeber paytype и в реализации это свойство? что слишком пусто? – Amit

+0

просто учится программировать в данный момент, и это назначение, которое я делаю в данный момент, и не могу понять, что использовать в условиях цикла. – xyz

ответ

1

Как Yorye заявил в комментариях, вы можете пересмотреть свой дизайн.

Следующий запрос linq дает то, что вам нужно.

var res = custArray.Where(c => c != null).SelectMany(c => c.Orders) 
     .GroupBy(c => c.Pay.GetType().ToString()) 
     .Select(c => new { PayType = c.Key, Sum = c.Sum(a => a.Price * a.Quantity) }); 

    foreach (var re in res) 
    { 
     Console.WriteLine("CardType {0}, Total : {1}", re.PayType.ToString(), re.Sum); 
    } 

Поскольку вы являетесь гнуренцем, может потребоваться некоторое время, чтобы понять некоторые из этих передовых концепций.

В качестве альтернативы вы можете обратиться к нижеприведенному коду.

var results = new Dictionary<string, decimal>(); 

foreach (var order in customer.Orders) 
{ 
    string key = order.Pay.GetType().ToString(); 
    if (!results.ContainsKey(key)) 
    { 
     results.Add(key,(decimal) 0.0); 
    } 

    results[key] += results[key] + order.Quantity*order.Price; 
} 
+0

Благодарим вас за руководство Yorye, сейчас это работает отлично. Вы делаете это так просто. – xyz

+0

@Priya, первый день в StackOverflow :-). На это ответил Хари. – Jagannath

+0

да, это мой первый день. К сожалению, на данный момент все кажется сложным. Спасибо Хари. Не могли бы вы объяснить, что такое c => c и что имеется в виду c.key и что такое – xyz

1

Вы действительно много, чтобы узнать, судя из вашего кода, узнать о размахе, синтаксис, перегруженные методы метода Console.WriteLine(), и это должно получить вас на вашем пути для этого задания, у меня есть немного исправил ваш код. Использование перечисления (Google его), чтобы различать между типами оплаты ... Внутри основного метода:

 static void Main(string[] args) 
    { 
     Customer[] custArray = new Customer[3]; 

     // First Customer 
     custArray[0] = new Customer() { FirstName = "Adam", LastName = "Miles", Orders = new Order[2] }; 
     custArray[0].Orders[0] = new Order() { Description = "Shoes", Price = 19.99M, Quantity = 1, PayType = PayType.MasterCard }; 
     custArray[0].Orders[1] = new Order() { Description = "Gloves", Price = 29.99M, Quantity = 2, PayType = PayType.Visa }; 

     // Second Customer 
     custArray[1] = new Customer() { FirstName = "Andrew", LastName = "Hart", Orders = new Order[2] }; 
     custArray[1].Orders[0] = new Order() { Description = "Jacket", Price = 39.99M, Quantity = 1, PayType = PayType.MasterCard }; 
     custArray[1].Orders[1] = new Order() { Description = "Socks", Price = 49.99M, Quantity = 1, PayType = PayType.Visa }; 

     decimal total = 0; 
     decimal totalMaster = 0; 
     decimal totalVisa = 0; 
     decimal totalPaypal = 0; 

     foreach (var customer in custArray) 
     { 
      if (customer == null) continue; 

      Console.WriteLine("Customer:\n"); 
      Console.WriteLine("{0, 15} {1, 17}", "First Name", "Last Name"); 
      Console.WriteLine("{0, 11} {1, 16}", customer.FirstName, customer.LastName); 
      Console.WriteLine("Orders:\n"); 

      decimal cust_total = 0; 
      decimal cust_totalMaster = 0; 
      decimal cust_totalVisa = 0; 
      decimal cust_totalPaypal = 0; 

      foreach (var order in customer.Orders) 
      { 
       if (order == null) continue; 

       Console.WriteLine("{0, 10} {1, 10} {2, 10}{3, 15}", order.Description, order.Price, order.Quantity, order.PayType); 
       Console.WriteLine("\n\n"); 

       total += order.Price * order.Quantity; 
       cust_total += order.Price * order.Quantity; 

       if (order.PayType == PayType.MasterCard) 
       { 
        totalMaster += order.Price * order.Quantity; 
        cust_totalMaster += order.Price * order.Quantity; 
       } 

       else if (order.PayType == PayType.Visa) 
       { 
        totalVisa += order.Price * order.Quantity; 
        cust_totalVisa += order.Price * order.Quantity; 
       } 

       else if (order.PayType == PayType.Paypal) 
       { 
        totalPaypal += order.Price * order.Quantity; 
        cust_totalPaypal += order.Price * order.Quantity; 
       } 
      } 
      Console.WriteLine("MasterCard Total: {0, 8}", cust_totalMaster); 
      Console.WriteLine("Visa Total: {0, 13}", cust_totalVisa); 
      Console.WriteLine("Paypal Total: {0, 8}", cust_totalPaypal); 
      Console.WriteLine("Total: {0, 18}", cust_total); 
     } 
     Console.WriteLine("\n\n"); 
     Console.WriteLine("MasterCard GrandTotal: {0, 10}", totalMaster); 
     Console.WriteLine("Visa GrandTotal: {0, 13}", totalVisa); 
     Console.WriteLine("Paypal GrandTotal: {0, 10}", totalPaypal); 
     Console.WriteLine("GrandTotal: {0, 18}", total); 

     Console.ReadLine(); 
    } 

Классы:

class Customer 
{ 
    public string FirstName; 
    public string LastName; 
    public Order[] Orders; 

} 
class Order 
{ 
    public string Description; 
    public decimal Price; 
    public int Quantity; 
    public PayType PayType { get; set; } 
    //public IPay Pay; 
    // Payment type p=new pay 

} 

enum PayType{ 

    MasterCard, 
    Visa, 
    Paypal 
} 

Я настоятельно рекомендую шаги ребенка, поэтому я изменил ваш немного структурируйте, чтобы вы могли надеяться лучше понять некоторые концепции, немного изменить код, чтобы лучше изучить основы языка и программирования, прежде чем погрузиться в глубокие глубины - это будет потрясающе.

Вам просто нужно зафиксировать вкладку форматирования ...

+0

Спасибо за ваш ответ. Я понимаю понятия, но не могу их реализовать. Ваша программа дает мне лучшее понимание. – xyz

+0

Я тоже был немного смущен вашим требованиям, поэтому я попробовал более широкий охват.Я рад, что это помогло, как только вам стало комфортно с C# (что удивительно) потратить некоторое время и исследования LINQ (Language Integrated Query) - вот что Хари использовал, чтобы ответить на ваш вопрос -> Очень очень мощный ... – EaziLuizi

+0

Thank вы проиграли и Хари. Эти решения были очень полезными, и я действительно прошел также учебники по языку Linq. У меня есть еще один вопрос: – xyz

Смежные вопросы