C# 如何检查函数是否在C上正确运行

C# 如何检查函数是否在C上正确运行,c#,C#,嗨,我正在用C写一个程序,它使用一个文本文件来管理用户名和密码。我知道这是一个不好的方法,但这是一个学校项目,也是我第一次做这样的事情 我有一个函数可以删除文本文件中的一行: static public void RemoveUser() { Console.Clear(); Console.WriteLine("Voer naam en wachtwoord in van de gebruiker die u wilt verwijderen."); //here i'm

嗨,我正在用C写一个程序,它使用一个文本文件来管理用户名和密码。我知道这是一个不好的方法,但这是一个学校项目,也是我第一次做这样的事情

我有一个函数可以删除文本文件中的一行:

static public void RemoveUser()
{
     Console.Clear();
     Console.WriteLine("Voer naam en wachtwoord in van de gebruiker die u wilt verwijderen."); //here i'm asking for the username and password of the user they want to delete
     string removedUser = Console.ReadLine();
     File.WriteAllLines("db.txt", File.ReadLines("db.txt").Where(l => l != removedUser).ToList());
}
当我现在运行这个函数时,用户输入是invalidtypo,不存在用户,代码运行时不会出错,但不会对文本文件执行任何操作。 我现在想要的是检查函数是否正确,以便在用户输入无效时显示错误,例如,当他们输入错误或试图删除不存在的用户时

我在谷歌上搜索了答案,但什么也找不到

文本文件如下所示:

Verkoper 2
Admin 3
Inkoper 1

您可以事先加载文本文件,并检查是否有任何行与输入匹配,如下所示:

string user = Console.ReadLine();
string[] lines = File.ReadAllText("db.txt").Replace("\r", "").Split('\n');
if (!lines.Contains(user))
{
    //handle your invalid user here.
}

在尝试删除文件之前,可以检查文件中是否存在用户:

var users = File.ReadAllLines("db.txt")
       .Select(l => var u = l.Split(' '); return new {Name = u[0], Id = u[1]}).ToList();

string removedUser = Console.ReadLine();
if(users.Any(x => x.Name == removeUser))
    File.WriteAllLines("db.txt", users.Where(l => l.Name != removedUser).Select(x => $"{x.Name} {x.Id}").ToArray());
else
    Console.WriteLine("Invalid username!");
要按Id删除,您可以更改

File.WriteAllLines("db.txt", users.Where(l => l.Name != removedUser).Select(x => $"{x.Name} {x.Id}").ToArray());


我建议您使用对象来表示保存的数据,这样您的代码就更有意义了

简单地说:

public class User
{
    public string Login { get; set; }
    public string Password { get; set; }
}
然后像这样读取您的文件:

static string FilePath = "temp.bak";
static IList<User> Users;

public static bool FileLoad()
{
    Users =
        File.ReadAllLines(FilePath)
            .Where(line => !string.IsNullOrWhiteSpace(line))
            .Select(line => new User(line))
            .ToList(); ;
    return true;
    //false: try/catch, corrupted users data, invalid file, etc..
}
现在删除用户可以非常直接和明确:

Users.Where(u => u.Login != "Login_Test_Delete")
我们只需在文件中保留更改:

private static bool Save(IEnumerable<User> demoUserSet)
{
    var projection = demoUserSet
                        .Select(x => x.ToString());

    File.WriteAllLines(FilePath, projection);
    return true;

    // Try/Catch for false. Any retry ? etc.
}

将文件的文本行放入变量中,并使用.Contains进行检查。这样,如果没有一行与学校项目匹配,如果主题不是字符串操作,您可以自己犯错误。去上课。如果提议将某物存储在文件中并检索它,那么某物就是一个对象。它应该有一个好的名字和财产。然后我们从文件到列表customObject。只有真正的列表对象操作。输入列表只是在分隔符上读取全部拆分,然后将其传递给对象构造函数,但这是关于对函数进行单元测试的问题吗?@DragandDrop该项目是用C编写整个程序。从文本文件中删除用户是其中的一部分。我的英语很差,但我只说C。它基本上是在列表上工作字符串的列表很酷,但具有属性的对象列表更酷。这是我的立场,我的第二个评论是关于你的标题。验证特定上下文中操作的正确执行称为单元测试。你的方法不接受任何参数,也不返回任何内容,这使得测试变得更加困难。你丢失了文本行的第二部分。File.ReadAllLinesdb.txt.Wherel=>!l、 拆分“”[0]。包含删除用户。Wille会按过滤位置给您行,这样File.writeAllines不会更改文件completly@DragandDrop是的,你是对的。我编辑了我的答案。@whole,虽然这可能有效。这是一个在线上的包含。而不是密码或登录您存储的任何信息。如果中的用户名包含密码,它将删除行。如果要删除的用户是空格,则您已删除所有行。@DragandDrop包含的内容与整个元素匹配,否?不是元素的子字符串。是的,这是一个非常简陋的方法,但使用不会删除所有用户。是的,我的错。它不是字符串包含,而是数组包含。因此,他必须计算准确的时间来删除它。
Users.Where(u => u.Login != "Login_Test_Delete")
private static bool Save(IEnumerable<User> demoUserSet)
{
    var projection = demoUserSet
                        .Select(x => x.ToString());

    File.WriteAllLines(FilePath, projection);
    return true;

    // Try/Catch for false. Any retry ? etc.
}