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