4

认为我一直在看我的代码太多。

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

我创建了这个小样本来说明我想要做什么。

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
4

5 回答 5

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

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

于 2012-04-11T13:07:15.883 回答
3

比使用 MoreLinq 项目对整个集合进行排序(在大型输入集合上可能很昂贵)更有效MaxBy

var person = persons.Where(p => p.Age <= input)
                    .MaxBy(p => p.Age);
于 2012-04-11T13:11:27.823 回答
1
var nearest = persons.OrderBy(p => Math.Abs(p.Age - i)).First();

这将返回年龄最接近输入值的人,Math.Abs以获取绝对差。

于 2012-04-11T13:10:34.593 回答
0

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

于 2012-04-11T13:08:34.673 回答
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();
于 2012-04-11T13:15:43.007 回答