Как бы я прочитал это? - PullRequest
2 голосов
/ 20 марта 2011

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

Dr
James
M
Magee
12/05/1978
12
Dakedon Avenue
Mutley
Plymouth
Devon
PL87TS
babiesrus123
2
54-25-36
2455871265
jennies uni account !!!
02/12/1999
-25.36
2000
8
02/02/2010
OTR
Scottish Highlands Vacations Inc.
-650
-675.36
02/02/2010
C/R
Mobiles Inc  - month 4  cash back 
20
-655.36
05/02/2010
OTR
C.Oldgam Travel Insurance service
-44.55
-699.91
08/02/2010
POS
Wrapping Up.Net
-800
-1499.91
12/02/2010
OTR
Carphone Warehome
-145
-1644.91
17/02/2010
D/D
Leather World - loan repayment
-75
-1719.91
22/02/2010
D/D
park deans - loan repayment
-88.56
-1808.47
02/03/2010
ATM
Stirling University
-120
-1928.47
58-69-71
12455871265
johns uni account !!!
02/12/1999
-25.36
1500
6
02/02/2010
D/D
SUBar Monthly Bill- Plymouth
-259.99
-285.35
02/02/2010
C/R
Monthly allowance
450
164.65
02/02/2010
D/D
SUBar Monthly Bill- Plymouth
-325.36
-160.71
02/02/2010
C/R
Monthly allowance
450
289.29
02/02/2010
D/D
SUBar Monthly Bill- Plymouth
-78.36
210.93
02/02/2010
C/R
Monthly allowance
450
660.93

В приведенном фрагменте из файла: 1 клиент 2 счета Каждая учетная запись имеет несколько транзакций.

Как бы я прочитал эту информацию в Сингл? Структура данных ArrayList при использовании методов get и set в классах (Customer, Account, Transaction). Что меня смущает, так это то, как мне читать эти данные и отслеживать, сколько учетных записей имеет клиент и сколько транзакций имеет учетная запись.

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

Loop through Customer 1
    Loop through Customer Account 1
       Loop through Customer Account 1 Transactions
    Loop through Customer Account 2
       Loop through Customer Account 2 Transactions
Loop through Customer 2
...

О текстовом файле:

•   Customer ID number --- this is the first customer 1
•   Customer title
•   Customer first name
•   Customer initials  //not required - defaults to null
•   Customer surname
•   Customer date of birth
•   Customer house name or number
•   Customer street name
•   Customer address area  //not required - defaults to null
•   Customer city or town name
•   Customer county
•   Customer postcode
•   Customer password *minimum size is 8 characters in length
•   The number of accounts belonging to this customer ---  equals 2 in this example

    o   Account sort code --- this is the first account of customer 1
    o   Account Number
    o   Account Nick Name //not required – defaults to null
    o   Date the account was created
    o   Current account balance
    o   Account  overdraft limit
    o   Number of transactions available for this account---  equals 2 in this example 

           Transaction Date --- this is the first transaction of account 1
           Transaction Type
           Transaction Description
           Transaction Amount
           Transaction Balance after transaction has been applied to account

           Transaction Date --- this is the second transaction of account 1
           Transaction Type
           Transaction Description
           Transaction Amount
           Transaction Balance after transaction has been applied to account

    o   Account sort code --- this is the second account of customer 1
    o   Account Number
    o   Account Nick Name //not required – defaults to null
    o   Date the account was created
    o   Current account balance
    o   Account  overdraft limit
    o   Number of transactions available for this account---  equals 2 in this example

           Transaction Date --- this is the first transaction of account 2
           Transaction Type
           Transaction Description
           Transaction Amount
           Transaction Balance after transaction has been applied to account

           Transaction Date --- this is the second transaction of account 2
           Transaction Type
           Transaction Description
           Transaction Amount
           Transaction Balance after transaction has been applied to account


•   Customer ID number --- this is the second customer 
•   Customer title
•   Customer first name
•   Customer initials  //not required - defaults to null
•   Customer surname
•   ...
•   ...
•   ...

Любая помощь очень ценится!

Спасибо.

Ответы [ 4 ]

2 голосов
/ 20 марта 2011
  1. Определение классов для клиента, счета и транзакции
  2. Используйте System.IO.File.OpenText(), чтобы получить TextReader, и reader.ReadLine(), чтобы получить ваши строки.
  3. Не не использовать ArrayList, он устарел. Используйте List<Customer>, List<Account> и т. Д.

Изменить, посмотрев на предыдущий вопрос:

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

Просто набросок:

public class Customer
{
    public string CustomerNumber { get; set; }
    // other properties

    public List<Account> Accounts { get; private set; }  // collection property

    public Customer()  // default constructor
    {
         Accounts = new List<Account>();

    }

}

Теперь, когда вы создали учетную запись, вы можете использовать currentCustomer.Accounts.Add(currentAccount);

1 голос
/ 20 марта 2011

Хорошо, тогда, возможно, это поможет:

Обновите класс Customer с помощью свойства универсального списка учетных записей.

 private int numberAccounts;

        public List<Account> Accounts {
            get;
            protected set;
        }

        public Customer(string theCustomerNumber, string theCustomerTitle, string theFirstName, string theInitials, string theSurname, string theDateOfBirth, string theHouseNameNumber, string theStreetName, string theArea, string theCityTown, string theCounty, string thePostcode, string thePassword, string theNumberAccounts)
        {
            customerNumber = theCustomerNumber;
            customerTitle = theCustomerTitle;
            firstName = theFirstName;
            initials = theInitials;
            surname = theSurname;
            dateOfBirth = theDateOfBirth;
            houseNameNumber = theHouseNameNumber;
            streetName = theStreetName;
            area = theArea;
            cityTown = theCityTown;
            county = theCounty;
            postcode = thePostcode;
            password = thePassword;
            setNumberAccounts(theNumberAccounts);
            Accounts = new List<Account>();
        }

Обновите учетную запись с помощью свойства общего списка транзакций

public List<Transaction> Transactions {
    get;
    protected set;
}

public Account(string theAccSort, string theAccNumber, string theAccNick, 
               string theAccDate, string theAccCurBal, string theAccOverDraft, 
               string theAccNumTrans)
{
    accSort = theAccSort;
    setAccNumber(theAccNumber);
    accNick = theAccNick;
    accDate = theAccDate;
    setAccCurBal(theAccCurBal);
    setAccOverDraft(theAccOverDraft);
    setAccNumTrans(theAccNumTrans);
    Transactions = new List<Transaction>();
}

Закомментируйте ваш метод "readData ()" и замените его следующим:

 private void readData() {
            ///read all the data into memory (if you can)
            string[] _data = File.ReadAllLines(inputDataFile);
            Queue<String> _lines = new Queue<string>();
            foreach (string _line in _data) {
                _lines.Enqueue(_line.Trim()); //put it into a queue for convience
            }

            ///iterate through the data and extract the details based on 
            ///known record delimiters.
            while (_lines.Count > 0) {
                Customer _customer = new Customer(
                    _lines.Dequeue(),
                    _lines.Dequeue(),
                    _lines.Dequeue(),
                    _lines.Dequeue(),
                    _lines.Dequeue(),
                    _lines.Dequeue(),
                    _lines.Dequeue(),
                    _lines.Dequeue(),
                    _lines.Dequeue(),
                    _lines.Dequeue(),
                    _lines.Dequeue(),
                    _lines.Dequeue(),
                    _lines.Dequeue(),
                    _lines.Dequeue());
                int _numberOfAccounts = _customer.getNumberAccounts();
                for (int i = 1; i <= _numberOfAccounts; i++) {
                    Account _account = new Account(
                        _lines.Dequeue(),
                        _lines.Dequeue(),
                        _lines.Dequeue(),
                        _lines.Dequeue(),
                        _lines.Dequeue(),
                        _lines.Dequeue(),
                        _lines.Dequeue());
                    int _numberOfTransactions = _account.getAccNumTrans();
                    for (int j = 1; j <= _numberOfTransactions; j++) {
                        Transaction _transaction = new Transaction(
                            _lines.Dequeue(),
                            _lines.Dequeue(),
                            _lines.Dequeue(),
                            _lines.Dequeue(),
                            _lines.Dequeue());
                        _account.Transactions.Add(_transaction);
                    }
                    _customer.Accounts.Add(_account);
                }

                ///update the legacy part of the system.
                bankDetails.Add(_customer);
                foreach (Account _account in _customer.Accounts) {
                    accDetails.Add(_account);
                    foreach (Transaction _transaction in _account.Transactions) {
                        tranDetails.Add(_transaction);
                    }
                }
            }
        }

РЕДАКТИРОВАТЬ: Закомментируйте ваш метод "showListsOfCust" и поместите его на место

private void showListsOfCust() {
            listBox1.Items.Clear();

            foreach (Customer c in bankDetails) {
                listBox1.Items.Add(c.getCustomerNumber() + " " + c.getCustomerTitle() + " " + c.getFirstName()
                                   + " " + c.getInitials() + " " + c.getSurname() + " " + c.getDateOfBirth()
                                   + " " + c.getHouseNameNumber() + " " + c.getStreetName() + " " + c.getArea()
                                   + " " + c.getCityTown() + " " + c.getCounty() + " " + c.getPostcode()
                                   + " " + c.getPassword() + " " + c.getNumberAccounts());
                foreach (Account a in c.Accounts) {
                    listBox1.Items.Add(a.getAccSort() + " " + a.getAccNumber() + " " + a.getAccNick() + " " + a.getAccDate()
                                       + " " + a.getAccCurBal() + " " + a.getAccOverDraft() + " " + a.getAccNumTrans());

                    foreach (Transaction t in a.Transactions) {
                        listBox1.Items.Add(t.getDate() + " " + t.getType() + " " + t.getDescription() + " " + t.getAmount()
                                           + " " + t.getBalAfter());
                    }
                }
            }
        }
0 голосов
/ 20 марта 2011

Чтение можно выполнить, как вы предлагаете, с помощью вложенных циклов. Это зависит от того, насколько расширяемым это должно быть. Если вы уверены, что формат данных никогда не изменится, вам не нужно создавать гибкую систему.

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

Вы можете присвоить клиентам, счетам и транзакциям все идентификационные номера и хранить их в словарях. Затем вы можете предоставить учетной записи Клиента список идентификационных номеров своих учетных записей, а также предоставить учетной записи список своих транзакций. Таким образом, данные о Счете и Транзакции не будут вложены в Клиентов. Есть и другие способы сделать это, это один из способов.

Например:

// Not global variables, you'd have to put them in a class somewhere
Dictionary<int,Customer> Customers;
Dictionary<int,Account> Accounts;

class Customer
{
    List<int> MyAccounts;
}

Для доступа к учетной записи, если у вас есть идентификатор, вы можете использовать учетные записи [id]; Например:

foreach(int id in MyAccounts)
{
    var account = Accounts[id];
    // Do whatever with the account here
}

Надеюсь, это полезно, если я каким-то образом упускаю суть, дайте мне знать. Поскольку вы ссылаетесь на ArrayLists и getters / setters, я предполагаю, что у вас есть Java-фон. Список здесь похож на ArrayList. Методы получения / установки выполняются в форме «Свойства» в C #. Словарь похож на карту в Java.

0 голосов
/ 20 марта 2011

Как то так?

While more customers
  Read Customer Information
  Read Number of Accounts
    Loop for each Account
       Read Account information
       Read transaction count
       Loop for each transaction
         Read transaction information
       End loop
    End loop
End loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...