2013-04-18 64 views
2

的最大值我有有對象的數組,這些對象有一個字符串,一個整數和炭的性質。獲得從對象陣列中C#

Person[] people = new Person[1]; //Declare the array of objects 

[...] This code is irrelevant 

Person person = new Person(name, age, gender); //This creates instance a new object 
people.SetValue(person, i); //is just a variable which increase in a c 
Array.Resize(ref people, people.Length + 1); //Change array size 
i++; // Autoincrement 

[...]更多的代碼,以填補這一工作

從存儲陣列的人的人的所有對象的價值,我想人的年齡最大值(年齡屬性是整數值)

+6

最大值本身,或具有最大值的人(或人)?如果是前者,那麼你可以使用'people.Max(person => person.Age);'另外,不要像這樣手動調整數組大小。使用'List ',它將處理您的大小。 「 – dlev

+0

」只是一個變量,在c中增加「什麼是」c「? –

回答

4

最簡單的方法是使用LINQ:

using System.Linq; 

var maxVal = people.Max(x => x.Age); // get highest age 
var person = people.First(x => x.Age == maxVal); // get someone with such an age 
+1

這是linq的糟糕用法。你需要做兩次清單。你只需要製作一個。 –

0

我假設你的Person類看起來是這樣的: -

class Person 
{ 
    public int Age { get; private set; } 
    public string Name { get; private set; } 
    public string Gender { get; private set; } 

    // constructor etc 
} 

改進

如果你有Person可枚舉,即「人」,爲此,我建議你使用一個容器的接口,如一個IList,即: -

IList<Person> people = new List<Person>(); 

由於這將節省您不必手動調整您的陣列。

解決方案

爲了獲得最大的年齡,你可以這樣做: -

var max = people.Max(p => p.Age); 

進一步閱讀

這是一個LINQ查詢;更多信息可以在這裏找到: -

http://msdn.microsoft.com/en-gb/library/vstudio/bb397926.aspx

有很多的「酷」的東西,你可以使用LINQ做的,比如選擇年齡的枚舉,即

var ages = people.Select(p => p.Age); 

這返回包含列表中每個人的年齡的枚舉。如果你想所有的超過一定年齡的,你可以使用Where,即: -

var above = people.Where(p => p.Age > 65); 
1

你真的不應該使用數組,如果你打算每次添加一個新項目的時間來調整它的大小來。這是通用List類是什麼。你可以寫:

List<Person> People = new List<Person>(); 
Person person = new Person(name, age, gender); 
People.Add(person); 

List需要調整的支持數組時,它需要照顧。每次添加項目時調整數組的大小都會更容易,更高效。

爲了獲得最大的年齡,你可以使用其他的答案顯示的LINQ表達式之一。如果你想有最大值的記錄,你必須遍歷列表:

Person maxItem = People[0]; 
foreach (Person person in People) 
{ 
    if (person.Age > maxItem.Age) 
    { 
     maxItem = person; 
    } 
} 
0

我完全被@dlev留下的評論表示贊同,因爲你不應該使用傳統Arrays而是使用List<T>它會自動處理你的收藏的大小。

此外,因爲ArrayList<T>都實現IEnumerable,您可以使用LINQ操縱您的元素,實際上看看你可以使用whole list of methods

在您的方案的具體例子:

var maxVal = people.Max(x => x.Age); 
var person = people.First(x => x.Age == maxVal); 
0

像這樣的事情會做你:

Person[] persons = {}; 
Person oldest = persons.Aggregate((x,y) => x.Age > y.Age ? x : y) ; 

或者你自己卷:

static T FindMax<T>(this IEnumerable<T> items , Func<T,T,int> comparer ) where T:class 
{ 
    T max = null ; 
    foreach (T item in items) 
    { 
    if (item == null) { continue ; } 
    if (max == null) { max = item ; continue ; } 

    // check current item against max. 
    // if current item is "greater than" the current max 
    // replace it. 
    int cc = comparer(item,max) ; 
    if (cc > 0) 
    { 
     max = item ; 
    } 
    } 
    return max ; 
} 

用法:

Person[] persons = LoadPersons() ; 
Person oldest = persons.FindMax<Person>((x,y) => x.Age < y.Age ? -1 : x.Age > y.Age ? +1 : 0) ; 
0

如果列表相對較小(少於1000個對象),上面提出的建議將會有效。這是因爲以上所有方法都使用順序搜索。出於性能目的(速度),應用qsort方法要高效得多。例如:

class PersonAgeComparer : IComparer<Person> 
{ 
    public Int32 Compare(Person x, Person y) 
    {     
     if (x.Age > y.Age) return 1; 
     if (x.Age < y.Age) return -1; 

     return 0; // must be equal 
    } 
} 

class Person 
{ 
    public Int32 Age { get; set; } 
} 

static void Run1() 
{ 
    Random rnd = new Random((Int32)DateTime.Now.Ticks); 

    List<Person> persons = new List<Person>(); 
    for (Int32 i = 0; i < 100000; i++) 
    { 
     persons.Add(new Person() { Age = rnd.Next(100) }); 
    } 

    persons.Sort(new PersonAgeComparer()); 

    // The oldest but you may have dups (same age) 
    Person oldest = persons[persons.Count - 1]; 

}