У нас есть программа, которая представляет из себя список дел сгруппированных по трём категориям. Пользователь может добавлять во все три категории дела. Необходимо избавиться от дублирующегося кода.
using System;
using System.Threading;
namespace TODOList
{
class Program
{
static void Main(string[] args)
{
string[] goalsIndividual = new string[0], goalsWork = new string[0], goalsFamilly = new string[0];
while (true)
{
Console.Clear();
//поиск длинны самого длинного списка на данный момент
int max = goalsIndividual.Length > goalsWork.Length ? goalsIndividual.Length : goalsWork.Length;
max = max > goalsFamilly.Length ? max : goalsFamilly.Length;
Console.WriteLine("Личный | Рабочий | Семейный");
for (int i = 0; i < max; i++)
{
if (goalsIndividual.Length > i)
{
Console.Write(goalsIndividual[i] + " | ");
}
else
{
Console.Write("Empty | ");
}
if (goalsWork.Length > i)
{
Console.Write(goalsWork[i] + " | ");
}
else
{
Console.Write("Empty | ");
}
if (goalsFamilly.Length > i)
{
Console.Write(goalsFamilly[i] + " | ");
}
else
{
Console.Write("Empty | ");
}
Console.WriteLine();
}
Console.WriteLine("Куда вы хотите добавить цель?");
string listName = Console.ReadLine().ToLower(); //то что введёт пользователь переведённое в нижний регистр
Console.WriteLine("Что это за цель?");
string goal = Console.ReadLine();
//Здесь нельзя использовать Array.Resize
if (listName == "личный")
{
string[] goalsIndividualNew = new string[goalsIndividual.Length + 1];
for (int j = 0; j < goalsIndividual.Length; j++)
{
goalsIndividualNew[j] = goalsIndividual[j];
}
goalsIndividualNew[goalsIndividualNew.Length - 1] = goal;
goalsIndividual = goalsIndividualNew;
}
else if (listName == "рабочий")
{
string[] goalsWorkNew = new string[goalsWork.Length + 1];
for (int j = 0; j < goalsWork.Length; j++)
{
goalsWorkNew[j] = goalsWork[j];
}
goalsWorkNew[goalsWorkNew.Length - 1] = goal;
goalsWork = goalsWorkNew;
}
else if (listName == "семейный")
{
string[] goalsFamillyNew = new string[goalsFamilly.Length + 1];
for (int j = 0; j < goalsFamilly.Length; j++)
{
goalsFamillyNew[j] = goalsFamilly[j];
}
goalsFamillyNew[goalsFamillyNew.Length - 1] = goal;
goalsFamilly = goalsFamillyNew;
}
}
}
}
}
Решение:
P.S. Обратите внимание, как я поступил с запутанным кодом определения самого длинного списка.
using System;
namespace TODOList
{
class Program
{
static void Main(string[] args)
{
string[] goalsIndividual = new string[0], goalsWork = new string[0], goalsFamilly = new string[0];
while (true)
{
Console.Clear();
DrawTable(goalsIndividual, goalsWork, goalsFamilly);
ShowAddNewGoalForm(ref goalsIndividual, ref goalsWork, ref goalsFamilly);
}
}
private static void ShowAddNewGoalForm(ref string[] goalsIndividual, ref string[] goalsWork, ref string[] goalsFamilly)
{
Console.WriteLine("Куда вы хотите добавить цель?");
string listName = Console.ReadLine().ToLower(); //то что введёт пользователь переведённое в нижний регистр
Console.WriteLine("Что это за цель?");
string goal = Console.ReadLine();
if (listName == "личный")
{
AddGoal(ref goalsIndividual, goal);
}
else if (listName == "рабочий")
{
AddGoal(ref goalsWork, goal);
}
else if (listName == "семейный")
{
AddGoal(ref goalsFamilly, goal);
}
}
private static void DrawTable(string[] goalsIndividual, string[] goalsWork, string[] goalsFamilly)
{
int max = GetMaxLength(goalsIndividual, goalsWork, goalsFamilly);
Console.WriteLine("Личный | Рабочий | Семейный");
for (int i = 0; i < max; i++)
{
TryDrawGoal(goalsIndividual, i);
TryDrawGoal(goalsWork, i);
TryDrawGoal(goalsFamilly, i);
Console.WriteLine();
}
}
private static void AddGoal(ref string[] category, string goal)
{
string[] categoryNew = new string[category.Length + 1];
for (int j = 0; j < category.Length; j++)
{
categoryNew[j] = category[j];
}
categoryNew[categoryNew.Length - 1] = goal;
category = categoryNew;
}
private static void TryDrawGoal(string[] category, int index)
{
if (category.Length > index)
{
Console.Write(category[index] + " | ");
}
else
{
Console.Write("Empty | ");
}
}
private static int GetMaxLength(params string[][] arrays)
{
int max = 0;
foreach (var array in arrays)
{
if (array.Length > max)
{
max = array.Length;
}
}
return max;
}
}
}