2015-12-02 33 views
0

抱歉不得不問一個看起來很愚蠢的問題,但我試了最後至少5小時的所有建議。它並沒有使它更清晰。 我是一個初學者程序員,我不知道爲什麼它不工作,沒有編譯錯誤,所以我需要你的幫助。List.Contains code not working,spent hours reading still still do it

我認爲這個問題是在list.Contains部分,因爲一切似乎工作,但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)); 
} 
+2

您不想使用'Contains',使用'Any',像這樣'_list .Any(c => c.Name ==「name」&& c.Pass =「pass」);'。這樣你就不需要重寫'=='和其他所有的絨毛。 – DavidG

回答

0

我可以在代碼中看到更多的問題。你有一個不需要任何參數的構造函數。這可能會導致其他開發人員創建一個不帶用戶名和密碼的Customer對象,然後調用方法LogIn()Register()。因此,最好刪除該構造函數,或者在Login()Register()方法中使用用戶名,密碼作爲參數。您正在以註冊方式將客戶分配到_list。但撥打LogIn()時,_list不會有任何客戶。所以你可能需要再次考慮你的設計。

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

謝謝!你是對的,該名單沒有任何客戶。看來我的代碼工作正常,但設計是問題。 它沒有工作的原因是因爲每次執行Frame.Navigate命令時_list都會重新啓動(或者對象被銷燬),所以我只是在同一頁面上進行登錄和註冊。 – Margarin

+0

在一個不相關的說明中,有沒有辦法讓它不這樣做,以便程序記住數據?所以如果我要去另一個頁面然後返回,我可以用相同的名字登錄並通過,而無需重新創建它。 – Margarin

+0

如果您需要在不使用數據庫的情況下執行此操作,則必須編寫自己的數據持久性機制。如果您正在考慮將數據存儲在RAM中,則可以查看[內存緩存](https://msdn.microsoft.com/zh-cn/library/system.runtime.caching.memorycache(v = vs 0.110)的.aspx)。但是如果你想把它存儲在H/D上,那麼使用數據庫要容易得多。我想你並沒有試圖開發自己的數據庫服務器。 :) –

1

當List.Contains被調用時,它的檢查,準確的對象列表之中,而是一個新的客戶是不同的對象,即使它擁有相同的值。嘗試更改您的客戶Equals方法來比較用戶名和密碼,而不是再次調用Customer.Equals。

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

這不可能工作,List.Contains檢查對象是否已經在列表中。但是在這裏,您正在創建一個帶有一些數據的全新對象,並且此新對象將定義爲而不是位於列表中。我會更合適地找到一個擁有這些屬性的客戶,或者更好地瞭解是否存在這樣的屬性。您可以使用List.Find()方法執行此操作,該方法將採用將Customer映射到bool的lambda表達式。你可以做例如爲:

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

Alternativley實施Equals(Customer otherCustomer)功能和使用功能的平等,以檢查是否存在列表中的這樣的用戶。

+0

查找?那是什麼意思? – DavidG

+0

查找lambda表達式爲「true」的第一個客戶對象。當然,你必須檢查它是否不是'null',我剛剛在我的答案中編輯過。但是我也喜歡其中一個評論中的Any()方法。提示:有這樣一種方法。 (https://msdn.microsoft.com/de-de/library/x0b5b5bc%28v=vs.110%29.aspx) –

0

List.Contains的工作沒有問題,因爲您已經覆蓋了Equals運算符。我寧願讓名稱不可變以便與哈希碼一起安全。我完全不瞭解代碼中的意圖,但構建CustomerList似乎很可疑,不應該在操作之間保留狀態?我重寫了代碼,以便對我有意義 - 行爲已更改(輸出爲「通過」):

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"); 
     } 
    }