C# 列表。包含不起作用的代码,花了几个小时阅读仍然无法获取

C# 列表。包含不起作用的代码,花了几个小时阅读仍然无法获取,c#,C#,对不起,我不得不问一个看起来很愚蠢的问题,但我在过去的至少5个小时里尝试了所有的建议。但这并没有让事情变得更清楚。 我是一个初学者程序员,我不明白为什么它不能工作,没有编译错误,所以我需要你的帮助 我认为问题在列表中。包含部分,因为其他一切似乎都工作,但idk 我的最终目标是拥有一种本地注册/登录系统(无需使用任何数据库或sql工具) 代码如下: class CustomerList { private string _x = "x"; priva

对不起,我不得不问一个看起来很愚蠢的问题,但我在过去的至少5个小时里尝试了所有的建议。但这并没有让事情变得更清楚。 我是一个初学者程序员,我不明白为什么它不能工作,没有编译错误,所以我需要你的帮助

我认为问题在列表中。包含部分,因为其他一切似乎都工作,但idk

我的最终目标是拥有一种本地注册/登录系统(无需使用任何数据库或sql工具)

代码如下:

    class CustomerList
    {
        private string _x = "x";
        private string _y = "y";
        private string _x2 = "x2";
        private string _y2 = "y2";

        private List<Customer> _list;
        //
        public string Username
        {
            get { return _x; }
            set { _x = value; }
        }
        // these are for the register
        public string Password
        {
            get { return _y; }
            set { _y = value; }
        }
        //
        public CustomerList()
        {
            _list = new List<Customer>();
        }
        //
        public string Username2
        {
            get { return _x2; }
            set { _x2 = value; }
        }
        //these are for the login
        public string Password2 {
            get { return _y2; }
            set { _y2 = value; } }
        //
        public void Register()
        {
            _list.Add(new Customer { Name = Username, Pass = Password });

        }


        public void Login()
        {
            if (_list.Contains(new Customer {Name = Username2, Pass = Password2}))
                CanLogin = true;
        }


        public bool CanLogin { get; set; } = false;
    }




   namespace App10.Model
    {
        public class Customer : IEquateable<Customer>
        {
            private string _password = "";
            private string _username = "";

        public Customer()
        {
        }
public Customer(string username, string password)
            {
                this.Pass = password;
                this.Name = username;
            }

            public string Name
            {
                get { return _username; }
                set { _username = value; }
            }

            public string Pass
            {
                get { return _password; }
                set { _password = value; }
            }

            public bool Equals(Customer other)
            {
                if (other == null)
                    return false;

                if (this._username == other._username)
                    return true;
                else
                    return false;
            }

            public override bool Equals(object obj)
            {
                if (obj == null)
                    return false;
                Customer customerObj = obj as Customer;
                if (customerObj == null)
                    return false;
                else
                    return Equals(customerObj);

            }

        public override int GetHashCode()
        {
            return this.Name.GetHashCode();
        }


        public static bool operator ==(Customer person1, Customer person2)
        {
            if (((object)person1) == null || ((object)person2) == null)
                return Object.Equals(person1, person2);

            return person1.Equals(person2);
        }

        public static bool operator !=(Customer person1, Customer person2)
        {
            if (((object)person1) == null || ((object)person2) == null)
                return !Object.Equals(person1, person2);

            return !(person1.Equals(person2));
        }

    }

    public interface IEquateable<T>
    {
    }
}


      private void register_Click_1(object sender, RoutedEventArgs e)
        {
            CustomerList ss = new CustomerList();
            ss.Username = textBox.Text;
            ss.Password = textBox1.Text;
            ss.Register();
            Frame.Navigate(typeof(BlankPage2));
}




     private void login_Click(object sender, RoutedEventArgs e)
        {
            CustomerList ss2 = new CustomerList();
            ss2.Login();
            if (ss2.CanLogin)
            {
                Frame.Navigate(typeof(MainPage));
}
class客户列表
{
私有字符串_x=“x”;
私有字符串_y=“y”;
专用字符串_x2=“x2”;
专用字符串_y2=“y2”;
私人名单(private List);;
//
公共字符串用户名
{
获取{return\ux;}
设置{ux=value;}
}
//这些是登记册上的
公共字符串密码
{
获取{return\u y;}
设置{u y=value;}
}
//
公共客户列表()
{
_列表=新列表();
}
//
公共字符串用户名2
{
获取{return}
设置{ux2=value;}
}
//这些是用于登录的
公共字符串密码2{
获取{return\uy2;}
设置{uy2=value;}}
//
公开作废登记册()
{
_添加(新客户{Name=Username,Pass=Password});
}
公共无效登录()
{
if(_list.Contains(新客户{Name=Username2,Pass=Password2}))
CanLogin=true;
}
public bool CanLogin{get;set;}=false;
}
名称空间App10.Model
{
公共类客户:iEquatable
{
私有字符串_password=“”;
私有字符串_username=“”;
公众客户()
{
}
公共客户(字符串用户名、字符串密码)
{
this.Pass=密码;
this.Name=用户名;
}
公共字符串名
{
获取{return\u username;}
设置{u username=value;}
}
公共字符串通行证
{
获取{return\u password;}
设置{u password=value;}
}
公共布尔等于(客户其他)
{
如果(其他==null)
返回false;
如果(此._用户名==其他._用户名)
返回true;
其他的
返回false;
}
公共覆盖布尔等于(对象对象对象)
{
if(obj==null)
返回false;
Customer customerObj=obj作为客户;
if(customerObj==null)
返回false;
其他的
返回等于(customerObj);
}
公共覆盖int GetHashCode()
{
返回此.Name.GetHashCode();
}
公共静态布尔运算符==(客户人员1、客户人员2)
{
如果(((对象)person1)==null | |((对象)person2)==null)
返回Object.Equals(person1,person2);
返回person1.Equals(person2);
}
公共静态布尔运算符!=(客户人员1、客户人员2)
{
如果(((对象)person1)==null | |((对象)person2)==null)
return!Object.Equals(person1,person2);
返回!(person1.Equals(person2));
}
}
公共接口可满足
{
}
}
私有无效寄存器\u单击\u 1(对象发送方,路由目标)
{
CustomerList ss=新CustomerList();
ss.Username=textBox.Text;
ss.Password=textBox1.Text;
ss.Register();
框架导航(typeof(BlankPage2));
}
私有无效登录\单击(对象发送者,路由目标)
{
CustomerList ss2=新CustomerList();
ss2.Login();
if(ss2.CanLogin)
{
框架导航(类型(主页));
}

调用List.Contains时,它会检查列表中的确切对象,但新客户是不同的对象,即使它具有相同的值。请尝试更改Customer Equals方法以比较用户名和密码,而不是再次调用Customer.Equals

    public void Login()
    {
        if (_list.Contains(new Customer {Name = Username2, Pass = Password2}))
            CanLogin = true;
    }
这不可能工作,
List.Contains
检查对象是否已经在列表中。但是在这里,您正在使用一些数据创建一个全新的对象,而这个新对象肯定不在列表中。我更适合查找具有这些属性的客户,或者更好,看看是否存在一个。您可以使用
List.Find()
方法,该方法将采用lambda表达式,该表达式将
Customer
映射到
bool
。您可以执行以下操作:

        if (_list.Find(c => c.Name == Username2 && c.Pass == Password2) != null)
            CanLogin = true;

Alternativley实现一个
等于(客户-其他客户)
函数并使用相等函数检查列表中是否存在这样的用户。

我可以在您的代码中看到更多问题。您有一个不需要任何参数的构造函数。这可能会导致其他开发人员创建一个没有用户名和密码的客户对象,然后调用类似
LogIn()的方法
Register()
。因此最好删除该构造函数,或者在
Login()和
Register()中使用用户名、密码作为参数
方法。您正在将客户分配给register方法中的
\u list
。但调用
登录()
时,
\u list
很可能没有任何客户。因此,您可能需要重新考虑您的设计

  public void Login(string username, string password)
  {
        CanLogin = (_list.Any(c => c.Name.Equals(username, StringComparison.CurrentCultureIgnoreCase) && c.Pass.Equals(password,StringComparison.CurrentCulture));
  }

由于您已经重写了Equals运算符,所以List.Contains可以正常工作
   class CustomerList
    {
        private List<Customer> _list = new List<Customer>();

        public void Register(string user, string password)
        {
            _list.Add(new Customer(user, password));
        }

        public bool CanLogin(string user, string password)
        {
            return _list.Contains(new Customer(user, password));
        }
    }

    public class Customer
    {
        public string Name { get; protected set; }
        public string Pass { get; set; }

        public Customer(string username, string password = "")
        {
            Name = username;
            Pass = password;
        }

        public bool Equals(Customer other)
        {
            if (other == null)
                return false;

            return this.Name == other.Name;
        }

        public override bool Equals(object obj)
        {
            if (obj == null)
                return false;
            Customer customerObj = obj as Customer;
            if (customerObj == null)
                return false;
            else
                return Equals(customerObj);
        }

        public override int GetHashCode()
        {
            return this.Name.GetHashCode();
        }

        public static bool operator ==(Customer person1, Customer person2)
        {
            if (((object)person1) == null || ((object)person2) == null)
                return Object.Equals(person1, person2);

            return person1.Equals(person2);
        }

        public static bool operator !=(Customer person1, Customer person2)
        {
            return !(person1 == person2);
        }
    }


    private void button30_Click(object sender, EventArgs e)
    {
        CustomerList ss = new CustomerList();
        ss.Register("Tony", "xx");

        if (ss.CanLogin("Tony", "xx"))
        {
            Console.WriteLine("Passed");
        }
    }