Запись данных в CSV, проверка дубликатов

Я пишу программу, которая принимает вводимые пользователем данные и записывает их в файл 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 ответ
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;
}

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *