C # несколько записей против объекта ветви - PullRequest
0 голосов
/ 10 сентября 2018

Запись о клиенте добавляется к филиалу (какого-либо продуктового магазина), который он посещает. Если клиент посещает несколько филиалов, он добавляется к нескольким филиалам с разными идентификаторами. Теперь мой вопрос: как мне получить только одну запись о клиенте, независимо от того, какой филиал он посещает и сколько филиалов он посещает.

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

namespace Console47
{
    class Customer
    {
        public Guid CustomerID { get; set; }
        public string CustomerName { get; set; }
        public string CustomerAddress { get; set; }
        public string CustomerEmail { get; set; }
        public string CustomerTelNo { get; set; }

    }
}

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

namespace Console47
{
    class Branch
    {
        public Guid BranchID { get; set; }
        public string BranchName { get; set; }
        public string BranchAddress { get; set; }
        public string BranchTelNo { get; set; }

        public List<Customer> customers = new List<Customer>();


        public void AddCustomer()
        {
            var customer = new Customer();

            Console.Write("\nEnter No of customers you want to Add: ");

            var input = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("\nPlease remember to Enter input in the following order:\n");


            for (int i = 0; i < input; i++)
            {
                Console.WriteLine("1-Customer Name:   2-Customer Address:   3-Customer Telno.:   4-Customer Email:   5-:Branch Name:\n");
                customers.Add(new Customer()
                {

                    CustomerID = Guid.NewGuid(),
                    CustomerName = Console.ReadLine(),
                    CustomerAddress = Console.ReadLine(),
                    CustomerTelNo = Console.ReadLine(),
                    CustomerEmail = Console.ReadLine(),

                });

            }
            Console.WriteLine("***************************");

        }
        public void SearchCustomer()

        {
            Console.Write("\nEnter the name of the customer to find out which branch it is related to:");

            var Cname = Console.ReadLine();

            foreach (var Customeritem in customers)
            {
                if (Cname == Customeritem.CustomerName )
                {
                    Console.WriteLine("\nCustomer ID:{0}\nCustomer Name:{1}\nCustomer Address:{2}\nCustomer Tel. No:{3}\nCustomer Email:{4}\n", Customeritem.CustomerID, Customeritem.CustomerName,Customeritem.CustomerAddress,Customeritem.CustomerTelNo,Customeritem.CustomerEmail);
                    Console.Write("\nCustomer found");
                }
                else if (Cname != Customeritem.CustomerName)
                {
                    Console.Write("Customer Not found");
                }
            }

        }

        public void DeleteCustomer()
        {

            Console.Write("To delete customer, enter name of the customer:");
            var Cname = Console.ReadLine();

            for (int i = 0; i < customers.Count; i++)
            {
                if (customers[i].CustomerName == Cname)
                {
                    customers.RemoveAt(i);
                    Console.Write("Customer found and deleted");
                    break;
                }
                else if (Cname != customers[i].CustomerName)
                {
                    Console.Write("Customer Not found");
                }
            }

        }
    }
}

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

namespace Console47
{
    class Program
    {
        static void Main(string[] args)
        {
            /***********Add branches************/

            List<Branch> branches = new List<Branch>();


            var branch = new Branch();

            Console.WriteLine("************************");
            Console.WriteLine("Total Branches of Lidel:");
            Console.WriteLine("************************\n");

            var branch1 = new Branch()
            {

                BranchID = Guid.NewGuid(),
                BranchName = "lidel1",
                BranchAddress = "ejbyvej 27",
                BranchTelNo = "55223366",

            };
            branches.Add(branch1);

            var branch2 = new Branch()
            {

                BranchID = Guid.NewGuid(),
                BranchName = "lidel2",
                BranchAddress = "kirkevej 45",
                BranchTelNo = "77885544",

            };
            branches.Add(branch2);
            var branch3 = new Branch()
            {

                BranchID = Guid.NewGuid(),
                BranchName = "lidel3",
                BranchAddress = "kirkevej 12",
                BranchTelNo = "553366611",

            };
            branches.Add(branch3);


            for (int i = 0; i < branches.Count; i++)
            {

                Console.WriteLine("\nBranch ID:{0}\nBranch Name:{1}\nBranch Address:{2}\nBranch Telno.{3}\n", branches[i].BranchID, branches[i].BranchName, branches[i].BranchAddress, branches[i].BranchTelNo);
                Console.WriteLine("************************");
            }



            /***********Add, delete, search customer in specific branch************/

            int choise;
            Console.WriteLine("\nPlease choose from the following option:\n");

        UserChoise:

            Console.WriteLine("\n1: Add Customers:\n2: Search Customer:\n3: Delete Customer:\n4: Display total no of customers in All Lidel Branches:\n5: Press enter to exit:\n");
            Console.Write("Your input is: ");
            choise = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("***************************");

            switch (choise)
            {
                case 1:
                    {
                        Console.Write("Enter the Branch name where you want to add the customer: ");
                        var BranchInput = Console.ReadLine();

                        if (BranchInput == branch1.BranchName)
                        {
                            branch1.AddCustomer();
                        }
                        else if (BranchInput == branch2.BranchName)
                        {
                            branch2.AddCustomer();
                        }
                        else if (BranchInput == branch3.BranchName)
                        {
                            branch3.AddCustomer();
                        }
                        else if (BranchInput != branch.BranchName)
                        {
                            Console.WriteLine("\nBranch doest not exist, Please enter again.\n");
                        }


                        goto UserChoise;
                    }
                case 2:
                    {
                        foreach (var bitem in branches)
                        {
                            bitem.SearchCustomer();
                            Console.Write(" in branch " +bitem.BranchName+".");
                        }
                        Console.WriteLine("***************************");
                        goto UserChoise;
                    }

                case 3:
                    {
                       foreach (var item in branches)
                        {
                            item.DeleteCustomer();
                            Console.Write(" in branch " + item.BranchName+ ".\n");
                        }
                        Console.WriteLine("***************************");
                        goto UserChoise;

                    }
                case 4:
                    {
                        //Console.WriteLine("***************************");
                        foreach (Branch bitem in branches)
                        {
                            foreach (Customer citem in bitem.customers)
                            {
                                Console.WriteLine("\nCustomer ID:{0}\nCustomer Name:{1}\nCustomer Address:{2}\nCustomer Telno.:{3}\nCustomer Email:{4}\n", citem.CustomerID, citem.CustomerName, citem.CustomerAddress, citem.CustomerTelNo, citem.CustomerEmail);
                                Console.WriteLine("***************************");
                            }
                        }
                        Console.WriteLine("***************************");
                        goto UserChoise;
                    }
                case 5:
                    {

                        Console.Write("Enter the Branch name to find its customers: ");
                        var BranchInput = Console.ReadLine();


                        foreach (Branch item in branches)
                        {
                            if (BranchInput == item.BranchName)
                            {
                                foreach (Customer citem in item.customers)
                                {

                                    {
                                        Console.WriteLine("\nCustomer ID:{0}\nCustomer Name:{1}\nCustomer Address:{2}\nCustomer Telno.:{3}\nCustomer Email:{4}\n", citem.CustomerID, citem.CustomerName, citem.CustomerAddress, citem.CustomerTelNo, citem.CustomerEmail);
                                        Console.WriteLine("***************************");
                                    }
                                }

                            }

                        }

                        goto UserChoise;
                    }

            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

уникальный клиент может посетить несколько филиалов.

Уникальный филиал может посещать кратных клиентов.

Это определяет отношение «многие ко многим» .

В базе данных это приводит к такой структуре таблицы:

1020 * клиенты *

id | someDatas
---+----------
 1 | ...
 2 | ...
 3 | ...

ветвь

id | someDatas
---+----------
 1 | ...
 2 | ...
 3 | ...

customerbranch

idcustomer | idbranch
-----------+----------
 1         | 1
 1         | 2
 2         | 3
 3         | 1
 3         | 2
 3         | 3

Где idcustomer и idbranch - внешние ключи к таблицам customers и branches

Поскольку вы не используете базы данных, отношения между классами Customer и Branch можно построить следующим образом:

class Customer
{
    public Guid CustomerID { get; set; }
    public string CustomerName { get; set; }
    public string CustomerAddress { get; set; }
    public string CustomerEmail { get; set; }
    public string CustomerTelNo { get; set; }

    public var Branches = new List<Branch>();
}

class Branch
{
    public Guid BranchID { get; set; }
    public string BranchName { get; set; }
    public string BranchAddress { get; set; }
    public string BranchTelNo { get; set; }

    public var Customers = new List<Customer>();
}

Тогда в методе Main я бы использовал 2 списка для клиентов и филиалов.

static void Main(string[] args)
{
    var branches = new List<Branch>();
    var customers = new List<Customer>();

    /* You can still of course hardcode some branches ... */
    branches.Add(new Branch
    {
        BranchID = Guid.NewGuid(),
        BranchName = "lidel1",
        BranchAddress = "ejbyvej 27",
        BranchTelNo = "55223366"
    });
    branches.Add(new Branch
    {
        BranchID = Guid.NewGuid(),
        BranchName = "lidel2",
        BranchAddress = "kirkevej 45",
        BranchTelNo = "77885544"
    });
    branches.Add(new Branch
    {
        BranchID = Guid.NewGuid(),
        BranchName = "lidel3",
        BranchAddress = "kirkevej 12",
        BranchTelNo = "553366611"
    });

    /* ... and some customers */

    customers.Add(new Branch
    {
        CustomerID = Guid.NewGuid(),
        CustomerName = "John Smith",
        CustomerAddress = "somewhere",
        CustomerTelNo = "0123456789",
        CustomerEmail = "john.smith@example.com"
    });
    customers.Add(new Branch
    {
        CustomerID = Guid.NewGuid(),
        CustomerName = "Jane Doe",
        CustomerAddress = "Elsewhere",
        CustomerTelNo = "9876543210",
        CustomerEmail = "jane.doe@example.com"
    });
    customers.Add(new Branch
    {
        CustomerID = Guid.NewGuid(),
        CustomerName = "Foo Bar",
        CustomerAddress = "anywhere",
        CustomerTelNo = "4242424242",
        CustomerEmail = "foo.bar@example.com"
    });
}

Сейчас есть несколько филиалов и несколько клиентов, но между ними пока нет никакой связи.

Вы можете создать метод в классе Branche, чтобы добавить существующего клиента.

class Branch
{
    //Some properties...

    //The customer already exists and is used as parameter
    public void AddCustomer(Customer customer)
    {
        this.Customers.Add(customer); //the reference to the customer is added to the list.

        /*
         * Now, since we're in a Mant-To-Many relation,
         * we have to add the current branch to the newly added customer
         */

        customer.Branches.Add(this);
    }
}

И мы можем сделать то же самое для класса Customer, но это не нужно:

class Customer
{
    //Some properties...

    //The branch already exists and is used as parameter
    public void AddBranch(Branch branch)
    {
        this.Branches.Add(branch); //the reference to the branch is added to the list.

        /*
         * Now, since we're in a Mant-To-Many relation,
         * we have to add the current customer to the newly added branch
         */

        branch.Customers.Add(this);
    }
}

Конечно, когда вы добавили ветку в объекте customer и добавили текущего клиента в ветку, не делайте branch.AddCustomers(this);, иначе будет бесконечный цикл, потому что метод вызовет другой.

Теперь давайте добавим Джейн Доу , второго клиента, в ветвь lidel3 , 3-й.

static void Main(string[] args)
{
    // Some code already written ...

    branches[2].AddCustomer(customers[1]);
}

Таким же образом мы можем добавить ветку lidel2 для клиента John Smith

static void Main(string[] args)
{
    // Some code already written ...

    customers[0].AddBranch(branches[1]);
}

Теперь ваша задача - написать левую часть кода, чтобы позволить пользователю добавлять новых клиентов, новые филиалы и создавать отношения между ними.

Дополнительно:

Чтобы избежать goto, я бы использовал эту логику:

int choice = 1; //default arbitrary value to make sure the while condition is true

while (choice >= 1 && choice <= 4) //condition is true if user input is 1 2 3 or 4
{
    Console.WriteLine("\n1: Add Customers:\n2: Search Customer:\n3: Delete Customer:\n4: Display total no of customers in All Lidel Branches:\n5: Press enter to exit:\n");
    Console.Write("Your input is: ");
    choice = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine("***************************");

    switch (choice)
    {
        case 1:
            //some code to handle the case 1
        break; //use break to leave the switch case instead of goto

        case 2:
            //some code to handle the case 2
        break;
        //And so on ...
    }
} //When while condition is false, the loop is exited
0 голосов
/ 10 сентября 2018

Как вы знаете, если клиент уже существует?По электронной почте?По имени?Давайте рассмотрим, что клиенты идентифицируются по CustomerName (как вы ищете в методе «SearchCustomer»).

У вас есть контекст «многие ко многим» (многие клиенты могут посещать множество филиалов, а многие филиалы могут посещать многие клиенты).).

Итак, если один и тот же клиент посещает множество филиалов, вам необходимо знать этого клиента.ОК.

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

Что-то вроде:

var customer = new List<Customer>()

Но вы не можете поместить это в метод Main, потому что он недоступен для методов Branch.Таким образом, вы можете сделать что-то вроде:

- Create a global list: public static List<Customer> Customers = new List<Customer>(); 
// initialize list for pass ArgumentNullException on LINQ methods

Изменение «for» в методе AddCustomer:

for (int i = 0; i < input; i++)
{

    Console.WriteLine("1-Customer Name:\n2-Customer Address:\n3-Customer Telno.:\n4-Customer Email:\n5-:Branch Name:\n");
    var customer = new Customer
    {
        CustomerName = Console.ReadLine()
    };
    //Search existing customer
    var existingCustomer = Customers.FirstOrDefault(c => c.CustomerName == customer.CustomerName);
    if (existingCustomer != null)
    { //existing customer encountered
        customers.Add(existingCustomer);
    }
    else
    {
        customer.CustomerID = Guid.NewGuid(); // generate new ID
        customer.CustomerAddress = Console.ReadLine();
        customer.CustomerTelNo = Console.ReadLine();
        customer.CustomerEmail = Console.ReadLine();
        customers.Add(customer);
        Customers.Add(customer); // add to global list
    }
}

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

РЕДАКТИРОВАТЬ:

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

var existingCustomer = Customers.FirstOrDefault(c => c.CustomerName == customer.CustomerName);
if (existingCustomer != null) //existing customer encountered ?
{ 
    // check if customer already added in the branch
    if(customers.Any(c => c.CustomerName == existingCustomer.CustomerName)){ 
        // do something
    }
    else {
        customers.Add(existingCustomer);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...