检查用户是否在对象列表中输入重复项的最简单方法?

时间:2019-01-17 17:00:41

标签: c# linq

我正在尝试创建一个系统,客户可以在该系统中进行注册,并将凭证保存在.bat文件(学校作业)中。需要做的一件事是用户输入的用户名必须唯一且不能存在。但是我无法使它正常工作,即使用户名不存在,它也会不断循环并提示用户输入用户名。还有其他一些对象(例如名称和姓氏)需要添加到列表中,并且用户可以输入它们的值,但是这些对象不必唯一。

需要注意的是,列表是在另一个名为“ Database.cs”的类中创建的,“客户”类是从“人”继承的。如果您还不希望我显示更多代码,请告诉我。谢谢。

在Database.cs

class Database

{

    public List<Customer> Customer { get; set; }

}

/ ------------------------------------------- --------------------------- /

在program.cs

static void AddCustomer(){

        Customer customer = new Customer();

        Database db = new Database();

        bool alreadyexists = db.Customer.Any(item => item.Username == customer.Username);

        do
        {
            if (alreadyexists == false)
            {
                Console.Write("Username: ");
                customer.Username = Console.ReadLine();
            }
            else
            {
                Console.WriteLine("Username already exists");
                Console.ReadKey();
            }
            BusinessManager.Instance.AddCustomer(customer);
            BusinessManager.Instance.SaveChanges();
        } while (!alreadyexists);

}

然后将其传递给另一个名为'BusinessManager.cs'的类

public void AddCustomer(Customer customer)
    {
        DataManager.Instance.AddCustomer(customer);
    }

然后将其传递给名为“ DataManager.cs”的类中的另一个方法

class DataManager
{
    static DataManager singleton;
    static Database db = null;

    public static DataManager Instance
    {
        get
        {
            if (singleton == null)
                singleton = new DataManager();
            return singleton;
        }
    }

    public DataManager()
    {
        db = new Database();
    }

public void AddCustomer(Customer customer)
    {
        db.Customer.Add(customer);
    }

2 个答案:

答案 0 :(得分:2)

如果我对问题的理解正确,那么这将满足您的需求...

static void AddCustomer()
{
    Database db = new Database();

    // declare the variable - populate its value later
    bool alreadyExists;

    do
    {
        Console.Write("Username: ");
        var username = Console.ReadLine();

        // check the value the user just entered
        alreadyExists = db.Customer.Any(item => item.Username == username);

        if (alreadyExists)
        {
            Console.WriteLine("Username already exists");
        }
    }
    // if alreadyExists is true, repeat
    while (alreadyexists);

    // now that we have a username that is not in the list, 
    // add the new customer, using the username variable
    var customer = new Customer
    {
        Username = username
    };

    BusinessManager.Instance.AddCustomer(customer);
    BusinessManager.Instance.SaveChanges();
}

您大都拥有它,但是您正在检查用户名在输入之前 ,并且您还在继续执行do / while循环,直到用户输入重复的用户名。

一旦输入了不在列表中的新用户名,它将创建一个新的Customer对象,并使用BusinessManager类添加和保存它。

答案 1 :(得分:1)

到达此行时,您的alreadyexists变量将只执行一次:

bool alreadyexists = db.Customer.Any(item => item.Username == customer.Username && item.ID == customer.ID);

然后在while循环迭代中对其进行检查时,该值仍与首次执行时相同。要在每次迭代中重新执行该查询,您绝对可以alreadyexists作为委托:

Func<bool> alreadyexists = () => db.Customer.Any(item => item.Username == customer.Username && item.ID == customer.ID);