查找基于另一个类变量

问题描述:

类变量

比方说,我创建了一个名为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

除了我相信有人会帮助你的技术实现之外,请考虑知道某人出生的那一年,并且当前日期并不能提供足够的信息来了解他们的年龄,因为他们可能有一个生日(月和日)在当前日期之后或当前日期之前。 –

你都应该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 >'结尾。 –

外约+/-一年的准确性的关注,我先给类进行计算你。

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