2016-03-21 127 views
0
類變量

比方說,我創建了一個名爲Person類,它有姓名,出生和它內部的性別的一年,例如:查找基於另一個類變量

class Person{ 
    public string name; 
    public int year; 
    public string gender; 
    public Person(string _name, int _year, string _gender) 
    { 
     name= _name; 
     year= _year; 
     gender= _gender; 
    } 
} 

使用這個類,我已經創建了3人在我的主,讓我們說:

 Person person1 = new Person("Bob",1992,"M"); 

    Person person2 = new Person("Gilbert", 1984, "M"); 

    Person persone = new Person("hank" 1989, "F"); 

我的問題是:這樣纔有可能建立,這需要一年作爲參數的方法,發現僅基於一個人的年齡和名字?

這裏是我做過什麼,但如果有比只有3人多了不少這是不是所有的好:

public string age(int ParamAge) 
{ 
     string message = ""; 
     if (ParamAge == 1992) 
      message = "Bob is " + (DateTime.Now.Year - ParamAge) + " years old."; 
     if (ParamAge == 1984) 
      message = "Gilbert is " + (DateTime.Now.Year - ParamAge) + " years old."; 
     if (ParamAge == 1989) 
      message = "Hank is " + (DateTime.Now.Year - ParamAge) + " years old."; 
     return message; 
} 
+0

把你的人的名單,你可以很容易地 – Plutonix

+2

什麼具有相同的出生年份多個人的查詢呢?你打算如何處理歧義? –

+1

除了我相信有人會幫助你的技術實現之外,請考慮知道某人出生的那一年,並且當前日期並不能提供足夠的信息來了解他們的年齡,因爲他們可能有一個生日(月和日)在當前日期之後或當前日期之前。 –

回答

1

你都應該Person實例添加到List<Person>。使用linq,你可以選擇一個標準的人。

爲了簡單起見,我用你的代碼:

// this is what you know, creating persons. 
Person person1 = new Person("Bob","McGee",1992,"M"); // <---- NOTE? four parameters???? (you code would not compile....) 

Person person2 = new Person("Gilbert", 1984, "M"); 

Person persone = new Person("hank" 1989, "F"); 

// create a list that contains Persons 
List<Person> list = new List<Person>(); 

// add those persons to the list. 
list.Add(person1); 
list.Add(person2); 
list.Add(persone); 

// with the FirstOrDefault() extension method you can select a person. 
Person person = personList.FirstOrDefault(item => item.year == year); 

// create a message 
string message; 

// check if the person is a valid instance, because FirstOrDefault will return the default(Person) if none of the persons mathes the criteria. (default == null) 
if(person != null) 
    message = Person.name + " is " + (DateTime.Now.Year - person.year).TotalYears + " years old."; 
else 
    message = "Could not find anyone"; 

// show the message. 
MessageBox.Show(message); 

總之你並不需要創建要添加一個人的聲明的foreach人。

例如:

list.Add(new Person("Gilbert", 1984, "M")); 
+0

這不是很好的解決方案。更優化的解決方案,將關鍵年份的值放入字典中。 –

+1

我愛字典,但我認爲這是下一章。在這種情況下,不應使用字典,因爲出生年份不是唯一的。你不想以'Dictionary >'結尾。 –

0

外約+/-一年的準確性的關注,我先給類進行計算你。

public class Person 
    { 
     public string Name { get; set; } 
     public int Year { get; set; } 
     public string Gender { get; set; } 
     public int RelativeAge 
     { 
      get { return DateTime.Today.Year - Year; } 
     } 

     public Person(string name, int year, string gender) 
     { 
      Name = name; 
      Year = year; 
      Gender = gender; 
     } 

     public string AgeStatement() 
     { 
      return string.Format("{0} is {1} {2} old.", Name, RelativeAge, MakePlural("year", RelativeAge)); 
     } 

     /// <summary> 
     /// Add an S to values over one. 
     /// </summary> 
     /// <param name="element">Item to be plural</param> 
     /// <param name="value"></param> 
     /// <returns></returns> 
     public string MakePlural(string element, int value) 
     { 
      return element + ((value > 1) ? "s" : ""); 
     } 
    } 

以下是驗證你的結果的測試:

[TestClass] 
    public class PersonUnitTests 
    { 
     [TestMethod] 
     public void TestPersonRelativeAge() 
     { 
      var p = new Person("Jane", 1986, "F"); 
      Assert.AreEqual(p.RelativeAge, 30); 
     } 

     [TestMethod] 
     public void TestAgeStatement() 
     { 
      var p = new Person("Jane", 1986, "F"); 
      Assert.AreEqual(p.AgeStatement(), "Jane is 30 years old."); 
     } 
    }