从c#中的对象数组中获取最大值
本文关键字:获取 最大值 数组 对象 | 更新日期: 2023-09-27 18:09:51
我有一个包含对象的数组,这些对象有字符串,整数和字符属性。
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
[…更多的代码来填充值
从存储在people数组中的所有对象person中,我想获得person的年龄最大值(age属性是整数值)
最简单的方法是使用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
我假设你的Person类看起来像这样:-
class Person
{
public int Age { get; private set; }
public string Name { get; private set; }
public string Gender { get; private set; }
// constructor etc
}
如果你有一个Person
的Enumerable,即'people',我建议您使用带有illist接口的容器,例如:-
IList<Person> people = new List<Person>();
因为这将节省你必须手动调整数组的大小。
<<p> 解决方案/strong>要获得最长寿的年龄,你可以这样做:-
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);
如果每次添加新项时都要调整数组的大小,那么就不应该使用数组。这就是通用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;
}
}
在。net 6.0中,我们现在有了一个新方法:
using System.Linq;
Person olderPerson = people.MaxBy(x => x.Age);
如果需要,也有MinBy
我完全同意@dlev留下的评论,因为你不应该使用传统的Arrays
,而应该使用自动处理集合大小调整的List<T>
。
另外,因为Array
和List<T>
都实现了IEnumerable,你可以使用LINQ来操作你的元素,事实上,看看你可用的方法的整个列表。
针对您的场景的具体示例:
var maxVal = people.Max(x => x.Age);
var person = people.First(x => x.Age == maxVal);
你可以这样做:
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 ) ;
如果列表相对较小(少于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];
}