how get customer first name and last name - c#

I'm wondering how to change this code to get first name and last name. My friend and I develop this code but I need to alter this code. There is Customer class as well where I set their properties. So looking for suggestion to alter this:
//Getting No: Of Customers for user wish to enter data.
do
{
needToGetInputFromUser = false;
Console.WriteLine("Please enter customer name");
customerName = Console.ReadLine();
if (customerName.Length < 5 || customerName.Length > 20)
{
Console.WriteLine("Invalid name length, must be between 5 and 20 characters");
Console.WriteLine("Please try again.");
Console.WriteLine(" ");
needToGetInputFromUser = true;
}
else
{
isUserEnteredValidInputData = true;
}
} while (needToGetInputFromUser);
//Getting Account number

My approach is slightly different from everyone else's, Where I ask for first name first, then last name. Here is the Customer class:
class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullName { get { return FirstName + " " + LastName; } }
}
Basically I create a Customer object then set the FirstName and LastName based on user input individually like so:
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var customer = new Customer();
customer.FirstName = GetStringValueFromConsole("Customer First Name");
customer.LastName = GetStringValueFromConsole("Customer Last Name");
Console.WriteLine("New Customers name: " + customer.FullName);
Console.WriteLine("Finished");
Console.ReadLine();
}
private static string GetStringValueFromConsole(string valueToAskFor)
{
var needToGetInputFromUser = false;
var stringValue = string.Empty;
do
{
Console.WriteLine("Please enter " + valueToAskFor);
stringValue = Console.ReadLine();
if (stringValue.Length < 5 || stringValue.Length > 20)
{
Console.WriteLine("Invalid \"" + valueToAskFor + "\", must be between 5 and 20 characters");
Console.WriteLine("Please try again.");
Console.WriteLine(" ");
needToGetInputFromUser = true;
}
else
{
needToGetInputFromUser = false;
}
} while (needToGetInputFromUser);
return stringValue;
}
}
}

List<Customer> ListOfCustomer = new List<Customer> ();
do
{
needToGetInputFromUser = false;
Console.WriteLine("Please enter customer name");
customerName = Console.ReadLine();
if (customerName.Length < 5 || customerName.Length > 20)
{
Console.WriteLine("Invalid name length, must be between 5 and 20 characters");
Console.WriteLine("Please try again.");
Console.WriteLine(" ");
needToGetInputFromUser = true;
}
else
{
Customer c = new Customer();
c.Name = customerName;
ListOfCustomer.Add(c);
isUserEnteredValidInputData = true;
}
} while (needToGetInputFromUser);
int CustomerCount = ListOfCustomer.Count;

I assume you get a string like:
Brian Mains
And you want to split by the " " between Brian and Mains, storing it in first/last name in the Customer object right? I think you are trying to do something like:
Customer c = new Customer();
if (customerName.Contains(" ")) {
var terms = customerName.Split(' ');
if (terms.Length == 2) {
c.FirstName = terms[0];
c.LastName = terms[1];
}
else {
//TBD
}
}

Related

Cannot validate properly the username and password using Array.Find()

I'm trying to make a username and login system to validate if the username and password passed by an user by input matches the username and password in an array of objects. I did using Array.Find() but when I run the program, the user and password are asked twice and I have to put them twice correct so I can advance which does not make sense...
Utilizador[] usersIniciais = utilizadoresDefault.UtilizadoresDefault(utilizadoresDefault.GenerateID());
PersonalTrainer[] ptsIniciais = ptsDefault.PTsDefault(utilizadoresDefault.GenerateID());
int option = novoLogin.LoginInicial();
Tuple<string, string> strings = novoLogin.DadosLogin(option);
string username = strings.Item1;
string password = strings.Item2;
novoLogin.ValidacaoDados(username, password, usersIniciais);
Console.ReadLine();
}
}
namespace RSGymPT.Classes
{
internal class Login
{
public static void Log(string Username)
{
Console.WriteLine($"User Logged: {Username}");
}
public int LoginInicial()
{
int option;
do
{
Console.Clear();
Console.WriteLine("Seleciona a opção pretendida: \n");
Console.WriteLine("1. Login");
Console.WriteLine("2. Sair\n");
Console.Write("A tua opção: ");
Int32.TryParse(Console.ReadLine(), out option);
} while (option != 1 && option != 2);
return option;
}
public Tuple<string, string> DadosLogin(int option)
{
if (option == 1)
{
Console.Clear();
Console.WriteLine("Please insert your Login data: \n");
Console.Write("User: ");
Username = Console.ReadLine();
Console.Write("Password: ");
Password = Console.ReadLine();
return Tuple.Create(Username, Password);
}
else if (option == 2)
{
Console.Clear();
Console.WriteLine("See you soon.\n");
Console.ReadKey();
Environment.Exit(0);
}
return Tuple.Create(Username, Password);
}
public void ValidacaoDados(string user, string password, Utilizador[] utilizadores)
{
Utilizador utilizador = Array.Find(utilizadores, element => element.NomeUtilizador == user);
do
{
Console.Clear();
Console.Write("User: ");
Username = Console.ReadLine();
Console.Write("Password: ");
Password = Console.ReadLine();
if (utilizador != null && utilizador.Password.Equals(password))
{
Console.WriteLine("Login correct");
}
else
{
Console.WriteLine("Bye");
Console.ReadKey();
Console.WriteLine();
Environment.Exit(0);
}
} while (Username == null || Password == null);
}
}
namespace RSGymPT.Classes
{
internal class Utilizador
{
public Utilizador[] UtilizadoresDefault(int id)
{
Utilizador[] usersInicial = new Utilizador[]
{
new Utilizador {Id = GenerateID(), Nome = "user1", NomeUtilizador = "user1user", Password = "user1234"},
new Utilizador {Id = GenerateID(), Nome = "user2", NomeUtilizador = "user2user", Password = "user1234"},
};
return usersInicial;
}
#endregion
}
}
I tried a lot of different approaches life foreach loop and array.firstOrDefault() but I keep with the same thing. Can someone kindly help me to find my mistake?

How to Display the details of a single person from a text file onto the console in C# from a PhoneBook for example?

static void AddContact()
{
string path = #"C:\Users\...\Desktop\Projekte\C# Übungen\ContactList/contacts.txt";
string name, address;
int phoneNumber;
bool addingContact = true;
string response;
List<string> ContactList = File.ReadAllLines(path).ToList();
while(addingContact)
{
System.Console.Write("Name: ");
name = Console.ReadLine();
System.Console.Write("Nummer: ");
phoneNumber = int.Parse(Console.ReadLine());
System.Console.Write("Adresse: ");
address = Console.ReadLine();
ContactList.Add($"Name: {name}");
ContactList.Add($"Nummer: {phoneNumber}");
ContactList.Add($"Adresse: {address} \n---------------------------------");
foreach (var contact in ContactList)
{
File.WriteAllLines(path, ContactList);
}
Console.Clear();
System.Console.WriteLine("Contact added successfully! Would you like to Add another Contact? (y)(n)");
response = Console.ReadLine().ToLower();
if(response == "y")
{
Console.Clear();
}
else
{
addingContact = false;
}
}
Console.WriteLine("Good bye!");
}
static void ShowContact()
{
string path = #"C:\Users\...\Desktop\Projekte\C# Übungen\ContactList/contacts.txt";
string response;
System.Console.WriteLine("Would you like to see all contacts (0) or a specific one (1)?");
response = Console.ReadLine();
switch (response)
{
case "0":
File.ReadAllLines(path);
break;
case "1":
System.Console.WriteLine("Type the name of the user: ");
string username = Console.ReadLine();
File.ReadAllLines(path)
break;
}
}
Thats everything. In the switch Statement at case 1 is where the problem is. I want it to look something like this if the user types John for example:
Name: John
Number: 233
Address: lolol 23
I already tried out something but i stopped in the middle of writing it because i realized that i dont actually know how to code that so i made my way over to stackoverflow to ask for help, thanks. Please be polite and i know that this code isnt the best, im a beginner.
Edit: I just found out that ShowContacts doesnt work at all
Edit 2: Fixed it with a foreach loop and List
List<string> contacts = File.ReadAllLines(path).ToList();
System.Console.WriteLine("Would you like to see all contacts (0) or a specific one (1)?");
response = Console.ReadLine();
switch (response)
{
case "0":
foreach (var contact in contacts)
{
Console.WriteLine(contact);
}
break;
}
Okay, if each item is broken down by three values consider chunking the data by three than iterate the results.
Change the Debug.WriteLine to Console.WriteLine below for your code.
Extension method for chunking
public static class ListExtensions
{
public static List<List<T>> ChunkBy<T>(this List<T> source, int chunkSize)
=> source
.Select((value, index) => new { Index = index, Value = value })
.GroupBy(x => x.Index / chunkSize)
.Select(grp => grp.Select(v => v.Value).ToList())
.ToList();
}
File contents
John
111
John's address
Mary
222
Mary's address
Bill
333
Bill's address
Code to first assert data is divisible by three than read the data, no assertion of data types or if null values are performed.
var contents = File.ReadAllLines("TextFile1.txt");
if (contents.Length % 3 == 0)
{
var results = contents.ToList().ChunkBy(3);
foreach (var list in results)
{
Debug.WriteLine($" Name: {list[0]}");
Debug.WriteLine($" Number: {list[1]}");
Debug.WriteLine($"Address: {list[2]}");
}
}
else
{
Debug.WriteLine("Malformed");
}
Edit: placed into a method
private static void ViewAllContacts()
{
var fileName = "TextFile1.txt";
if (File.Exists(fileName))
{
var contents = File.ReadAllLines(fileName);
if (contents.Length % 3 == 0)
{
var results = contents.ToList().ChunkBy(3);
foreach (var list in results)
{
Debug.WriteLine($" Name: {list[0]}");
Debug.WriteLine($" Number: {list[1]}");
Debug.WriteLine($"Address: {list[2]}");
}
}
else
{
Debug.WriteLine("Malformed");
}
}
else
{
Debug.WriteLine($"{fileName} not found");
}
}
Save your contact to json format, like this:
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.IO;
namespace JsonTester
{
// Open Package Manager Console:
// Tools >> Nuget Package Manager >> Package Manager Console
//
// Install libraries through Package Manager Console:
// PM > Install-Package System.Text.Json -Version 6.0.1
internal class Program
{
static List<Contact> contactList = new List<Contact>();
static readonly string MY_CONTACT = #"D:\MyContact.txt";
class Contact {
public string Name { get; set; }
public string Number { get; set; }
public string Address { get; set; }
}
static void EnterContact() {
var contact = new Contact();
Console.WriteLine("Name: ");
contact.Name = Console.ReadLine();
Console.WriteLine("Number: ");
contact.Number = Console.ReadLine();
Console.WriteLine("Address: ");
contact.Address = Console.ReadLine();
contactList.Add(contact);
}
static void SaveContact() {
if (contactList.Count > 0) {
foreach (Contact contact in contactList) {
String strContactJson = JsonSerializer.Serialize(contact);
File.AppendAllText(MY_CONTACT, strContactJson + "\n");
}
}
}
static void ReadContact()
{
try
{
Console.WriteLine("Read contact list:\n");
String[] strContactJsonArr = File.ReadAllLines(MY_CONTACT);
if (strContactJsonArr.Length > 0)
{
foreach (String s in strContactJsonArr)
{
Contact contact = JsonSerializer.Deserialize<Contact>(s);
if (contact != null)
{
Console.WriteLine("Name: " + contact.Name);
Console.WriteLine("Number: " + contact.Number);
Console.WriteLine("Address: " + contact.Address);
Console.WriteLine("");
}
}
Console.WriteLine("Found {0} contacts\n\n", strContactJsonArr.Length);
}
}
catch (Exception) {
Console.WriteLine("Contact list is empty\n");
}
}
static bool SearchContact(String name)
{
try
{
String[] strContactJsonArr = File.ReadAllLines(MY_CONTACT);
if (strContactJsonArr.Length > 0)
{
foreach (String s in strContactJsonArr)
{
Contact contact = JsonSerializer.Deserialize<Contact>(s);
if (contact != null)
{
if (contact.Name.Equals(name)) {
Console.WriteLine("");
Console.WriteLine("Name: " + contact.Name);
Console.WriteLine("Number: " + contact.Number);
Console.WriteLine("Address: " + contact.Address);
Console.WriteLine("");
return true;
}
}
}
}
}
catch (Exception)
{
}
return false;
}
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("- Press S for search contact.\n- Press N for new contact.\n- Press R for read contact list.\n");
ConsoleKeyInfo key = Console.ReadKey(true);
if (key.KeyChar == 's' || key.KeyChar == 'S')
{
Console.WriteLine("Searching contact.");
Console.Write("Enter name: ");
String name = Console.ReadLine();
bool isFounded = SearchContact(name);
if (isFounded)
{
Console.WriteLine("Contact is found\n");
}
else
{
Console.WriteLine("Contact isn't found!\n");
}
}
else if (key.KeyChar == 'n' || key.KeyChar == 'N')
{
EnterContact();
SaveContact();
}
else if (key.KeyChar == 'r' || key.KeyChar == 'R') {
ReadContact();
}
}
}
}
}
Console Output:
MyContact.txt (contact save in JSON format):

C# How to pass ARRAY from another Method

I'm a beginner with C# and I need little help. I'm not sure how can I take 'studentArray' from CreateStudent() and use it at ViewAllStudents(). Any help is appreciated!
static void CreateStudent()
{
// User Inputs
Console.WriteLine("Student Name: ");
var name = Console.ReadLine();
Console.WriteLine("Student Surname: ");
var surname = Console.ReadLine();
Console.WriteLine("Student ID: ");
var id = int.Parse(Console.ReadLine());
var student = new Students(name, surname, id); // Student Constructor
// Create Array and Resize it
Students[] studentArray = new Students[] { student };
Array.Resize(ref studentArray, studentArray.Length + 1);
studentArray[studentArray.GetUpperBound(0)] = student;
Console.WriteLine($"Student {student.Name} {student.Surname} with ID {student.StudentId} is successfully created!");
}
static void ViewAllStudents()
{
foreach(var student in studentArray)
{
Console.WriteLine($"\t {student}");
}
}
}
}
Change return type of CreateStudent from void to Students[] and return "studentArray" . Change the parameter type of ViewAllStudents() to "ViewAllStudents(Students[] studentArray )" .I hope the following will work.
static Students[] CreateStudent()
{
// User Inputs
Console.WriteLine("Student Name: ");
var name = Console.ReadLine();
Console.WriteLine("Student Surname: ");
var surname = Console.ReadLine();
Console.WriteLine("Student ID: ");
var id = int.Parse(Console.ReadLine());
var student = new Students(name, surname, id); // Student Constructor
// Create Array and Resize it
Students[] studentArray = new Students[] { student };
Array.Resize(ref studentArray, studentArray.Length + 1);
studentArray[studentArray.GetUpperBound(0)] = student;
Console.WriteLine($"Student {student.Name} {student.Surname} with ID {student.StudentId} is successfully created!");
return studentArray;
}
static void ViewAllStudents(Student[] studentArray)
{
foreach(var student in studentArray)
{
Console.WriteLine($"\t {student}");
}
}

Empty String Input Validation

I've been having trouble on understanding as of why my custom empty string validation method does not work compared when I check for an empty string directly
Validation.EmptyValidation(title,
"Please, do not leave the course title field empty!" +
"\r\nEnter the course title: ");
It does not output the course title in the end, but when I do it this way it does:
while (string.IsNullOrEmpty(title))
{
Console.WriteLine("No empty string: ");
title = Console.ReadLine();
}
Class:
Console.WriteLine("* Create Course *\r\n");
Console.WriteLine("Enter the course title: ");
string title = Console.ReadLine();
while (string.IsNullOrEmpty(title))
{
Console.WriteLine("No empty string: ");
title = Console.ReadLine();
}
Validation.EmptyValidation(title,
"Please, do not leave the course title field empty!" +
"\r\nEnter the course title: ");
Console.WriteLine("\r\nEnter the course description: ");
string description = Console.ReadLine();
Validation.EmptyValidation(description,
"Please, do not leave the course description field empty!" +
"\r\nEnter the course description: ");
Console.WriteLine("\r\nEnter the number of students in the course: ");
=string studentsInput = Console.ReadLine();
int.TryParse(studentsInput, out int students);
CreateCourse(currentCourse, title, description, students);
public static Course CreateCourse (Course _currentCourse, string title string description, int students)
{
Course course = new Course(title, description, students);
_currentCourse = course;
_currentCourse.Title = course.Title;
Console.WriteLine($"\r\nThank you for registering the {_currentCourse.Title} course.\r\n" +
$"\r\nCourse Information" +
$"\r\nTitle: {_currentCourse.Title}" +
$"\r\nDescription: {_currentCourse.Description}" +
$"\r\nStudents: {_currentCourse.Capacity}");
return _currentCourse;
}
Empty Validation Method:
public static string EmptyValidation(string input, string prompt)
{
while (string.IsNullOrEmpty(input))
{
Console.WriteLine(prompt);
input = Console.ReadLine();
}
return input;
}
There is a couple of things going wrong here
// you weren't returning the results
title = Validation.EmptyValidation(title,
"Please, do not leave the course title field empty!" +
"\r\nEnter the course title: ");
Also if you don't need the other validation anymore you are best to remove it
//while (string.IsNullOrEmpty(title))
//{
// Console.WriteLine("No empty string: ");
// title = Console.ReadLine();
// }

Strings-creating "passwords" and "users" (simple with strings)

I need to create a program that will take the users name and "password". If they match the program will say you are in if not, that you're out. I wrote it for 1 user, but I don't know how to make multiple users in one program. My code is below. Thanks for your help :)
Console.WriteLine("Enter your Name");
Console.WriteLine("Enter your Pswrd");
string name = Console.ReadLine();
string pswrd = Console.ReadLine();
string myname = "John";
string mypswrd = "123456";
if (name == myname & pswrd == mypswrd)
{
Console.WriteLine("You are logged in");
}
else
{
Console.WriteLine("Incorrect name or pswrd");
}
Console.ReadLine();
//building the user "database" each pair is <user,password>
Dictionary<string, string> users = new Dictionary<string, string>();
users.Add("John", "123456");
//Here you should add more users in the same way...
//But i would advise reading them from out side the code (SQL database for example).
Console.Writeline("Enter your Name");
string name = Console.ReadLine();
Console.WriteLine("Enter your Passward");
string password = Console.ReadLine();
if (users.ContainsKey(name) && users[name] == password)
{
Console.WriteLine("You are logged in");
}
else
{
Console.WriteLine("Incorrect name or password");
}
Console.ReadLine();
This should work (contains no checks to see if the entered values are correct or not, you should add this kind of safety yourself :)):
Dictionary<string, string> namesToCheck = new Dictionary<string, string>
{
{"John", "123456"},
{"Harry", "someotherpassword"}
};
Console.WriteLine("Enter your Name");
string name = Console.ReadLine();
Console.WriteLine("Enter your Pswrd");
string pswrd = Console.ReadLine();
if (namesToCheck.ContainsKey(name) && namesToCheck[name] == pswrd)
{
Console.WriteLine("You are logged in");
}
else
{
Console.WriteLine("Incorrect name or pswrd");
}
Console.ReadLine();
Why not use arrays?
Console.WriteLine("Enter your Name");
Console.WriteLine("Enter your Pswrd");
string name = Console.ReadLine();
string pswrd = Console.ReadLine();
string[] names = "James,John,Jude".Split(Convert.ToChar(","));
string[] passes = "Pass1, Word2, Password3".Split(Convert.ToChar(","));
for (int i = 0; i<names.Length, i++)
{
if (names[i] == name && passes[i] == pswrd)
{
Console.WriteLine("You are logged in");
}
else
{
Console.WriteLine("Incorrect name or pswrd");
}
}
This will work with the following name/pswrd combinations:
James/Pass1, John/Word2, Jude/Password3
For a bigger list I suggest you use external text file and read lines in each.

Categories

Resources