2014-09-28 29 views
0

我試圖創建一個模仿ATM的程序。在我的程序中,我需要檢查用戶輸入的字符串是否與對象列表中的任何對象的Name屬性匹配。如果不匹配,則會自動添加帳戶和其他一些默認值。如果它匹配,那麼我需要將在另一個表單上訪問的變量設置爲該賬戶對象的屬性。此外,這些屬性將需要從其他表單更新,以便該對象保持最新狀態。我認爲我可以弄清楚如何更新這些屬性,但我很難嘗試將變量設置爲當前帳戶,更具體地說,如何訪問匹配帳戶的屬性。我的類的構造函數如下:家庭作業找到對象列表中的匹配對象並訪問該對象的屬性

class Account 
{ 
    private string name; 
    public string Name 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
     } 
    } 
    private int acctNum = 0; 
    public int AcctNumber 
    { 
     get 
     { 
      return acctNum; 
     } 
     set 
     { 
      acctNum = value; 
     } 
    } 
    //initialize the CheckBalance value to 100.00 
    private decimal checkBalance = 100.00M; 
    public decimal CheckBalance 
    { 
     get 
     { 
      return checkBalance; 
     } 
     set 
     { 
      checkBalance = value; 
     } 
    } 
    public Account(string Name) 
    { 
     this.Name = Name; 
    } 
    private decimal saveBalance = 100.00M; 
    public decimal SaveBalance 
    { 
     get 
     { 
      return saveBalance; 
     } 
     set 
     { 
      saveBalance = value; 
     } 
    } 
} 

這個就很好了,因爲我需要的唯一的構造是Name屬性,而其他屬性被自動設置爲基準值。列表和相關的代碼,我現在有如下:

//variable that will be used to check textbox1.Text 
    string stringToCheck; 
    //array of class Account 
    List<Account> accounts= new List<Account>(); 
    public MainMenu() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     //set value to user's input 
     stringToCheck = textBox1.Text; 
     //set a var that only returns a value if the .Name already exists 
     var matches = accounts.Where(p => p.Name == stringToCheck); 
     //check through each element of the array 
     if (!accounts.Any()) 
     { 
      accounts.Add(new Account(stringToCheck)); 
     } 
     else if (matches != null) 


       //set variables in another form. not sure if these are working 
       Variables1.selectedAccount = ; 
       //is this calling the CheckBalance of the instance? 
       Variables1.selectedCheckBalance = accounts[i].CheckBalance; 
       //same thing? 
       Variables1.selectedSaveBalance = accounts[i].SaveBalance; 

       //switch to form 
       AccountMenu acctMenu = new AccountMenu(); 
       this.Hide(); 
       acctMenu.Show(); 




     } 

在上面的代碼中,「否則,如果(匹配!= NULL)」更多的是一種填充物,因爲我不知道該用什麼。當然,我還需要重寫「if(!accounts.Any())」部分,因爲一旦這個列表至少填充了一個對象,這段代碼就不會再出現。所以,實際上,我只需要知道如何檢查匹配的帳戶以及如何訪問該帳戶的屬性,以便我可以設置Variables1屬性以匹配。謝謝你的幫助!

回答

1

如果它適用於您的特定情況,var account = accounts.FirstOrDefault(p => p.Name == stringToCheck)將爲您提供與表達式匹配的集合中的第一個帳戶,如果不存在任何值,則返回null。

檢查account != null是否確保您在嘗試get屬性值時不會收到空引用異常。

然後,使用account.CheckBalance來獲取該特定帳戶的屬性值。

我可能沒有完全理解這個問題,不能評論,因爲我沒有50美譽:(

+0

由於這似乎工作,對我來說很有意義,但我得到的例外「對象未設置爲一個對象的實例「對於行:Variables1.selectedCheckBalance = matches.CheckBalance;這是否意味着」匹配「不是真正引用選定的帳戶?我也將第一個if語句更改爲:if(matches == null){添加一個帳戶},但這似乎不起作用,否則它會添加該帳戶。對嗎? – 2014-09-28 19:04:20

+0

'var matches = accounts.Where(p => p.Name == stringToCheck)'returns一個'IEnumerable',所以你不能調用'matches.CheckBalance'而不指定你想要的'matches'內的'Account'。你的'List accounts'有多個'Account'對象具有相同的'Name';當你調用'accounts.Where(p => p.Name == stringToCheck)'時,它們都會被返回。你是否將代碼更改爲上面的內容,還是你仍然使用相同的代碼? – Walnuts 2014-09-28 19:14:31

+0

首先我會調用這個'var account = accounts.FirstOrDefault(p => p.Name == stringToCheck)'然後,我會檢查'account'是否爲'null'。如果爲'null',那麼'account'列表中就不存在'Account',它與條件'p => p.Name == stringToCheck'匹配。 – Walnuts 2014-09-28 19:17:33

相關問題