选择年龄最接近数字的最高年龄

时间:2012-04-11 13:05:30

标签: c# .net linq

想想我一直在看我的代码。

但我的问题是我有一个无序列表,我需要选择最接近或等于输入的对象。

我已经创建了这个小样本来说明我想要做的事情。

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

var persons = new List<Person>
{
    new Person {Age = 10, Name = "Aaron"},
    new Person {Age = 15, Name = "Alice"},
    new Person {Age = 20, Name = "John"},
    new Person {Age = 22, Name = "Bob"},
    new Person {Age = 24, Name = "Malcom"}
};

int i = 17; //should return 'Alice 15'    
int y = 22; //should return 'Bob 22

5 个答案:

答案 0 :(得分:9)

var person = persons.Where(p => p.Age <= input).OrderByDecending(p => p.Age).First();

首先排除大于input(您的iy)的广告。然后开始对它们进行排序,然后它只取第一个结果。

答案 1 :(得分:3)

比使用MoreLinq项目的MaxBy {<3}}排序整个集合(在大型输入集合上可能很昂贵)更有效率:

var person = persons.Where(p => p.Age <= input)
                    .MaxBy(p => p.Age);

答案 2 :(得分:1)

var nearest = persons.OrderBy(p => Math.Abs(p.Age - i)).First();

使用Math.Abs返回年龄最接近输入值的人,以获得绝对差异。

答案 3 :(得分:0)

您遍历列表并存储int的绝对值减去Age。将Person存储在变量中,直到差异较小的人出现。如果相同,请存储具有较高年龄的那个。完成。

答案 4 :(得分:0)

这是我的一个例子,它可以帮助你

     List<int> list = new List<int> { 10, 15, 20, 22, 24 };
        int number = 17;
        int closest = list.Aggregate((x, y) => Math.Abs(x - number) < Math.Abs(y - number) ? x : y);
        Label2.Text = closest.ToString();