Я пишу программу, которая принимает вводимые пользователем данные и записывает их в файл CSV. Я также проверяю, не является ли то, что они вводят, дубликатом того, что находится в этом CSV-файле. Пока поток этого фрагмента кода:
- Получить ввод пользователя ->
- Пройдитесь по CSV-файлу и назначьте его списку ->
- Если список пуст (null) или если он не содержит имени пользователя ->
- Записать данные в CSV.
- Если ввод пользователя дублируется -> не пишите
Я немного новичок в ООП и C # в целом, поэтому любые советы будут оценены.
private string writeUser()
{
string filePath = "usernames.csv";
List<string> users = new List<string>();
try
{
using (StreamReader sr = new StreamReader(filePath))
{
while (sr.Peek() >= 0) // iterate through the csv and add it to our users list
{
users.Add(sr.ReadLine());
}
sr.Close();
}
using (StreamWriter sw = new StreamWriter(filePath, true))
{
if (users == null | !users.Contains(this.username)) // write to csv if users is empty, or if it doesnt contain the typed username
{
sw.WriteLine(this.username);
sw.Close();
}
else if (users.Contains(this.username))
{
Console.WriteLine("username already exists");
sw.Close();
}
}
}
catch (Exception e)
{
Console.WriteLine("Some Error Occured: n" + e.Message);
Console.ReadLine();
}
return this.username;
}
Как я могу упростить это / сделать то, что у меня есть, лучше?
1 ответ
Мы можем переписать это, чтобы оно было более декларативным. Не считая StreamReader
а также StreamWriter
являются довольно низкоуровневыми типами, в большинстве случаев нужно сделать другой вызов, чтобы лучше выразить свое намерение.
private string writeUser()
{
string filePath = "usernames.csv";
var found = false;
//we don't modify the existing list, don't store it
//if storing, I would use HastSet<> for better duplicate checking
if(File.Exists(filePath))
foreach(var user in File.ReadAllLines(filePath))//declare you want all the lines
{
if(user == username)
{
found = true;
break;//found it, stop looping
}
}
if(!found)
{
//AppendText will also Create the file for you too if not there
//skip boolean values that you need to check what the parameter affect
using (StreamWriter sw = File.AppendText(filePath))
{
sw.WriteLine(username);
}
}
return username;
}