想想我一直在看我的代码。
但我的问题是我有一个无序列表,我需要选择最接近或等于输入的对象。
我已经创建了这个小样本来说明我想要做的事情。
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
答案 0 :(得分:9)
var person = persons.Where(p => p.Age <= input).OrderByDecending(p => p.Age).First();
首先排除大于input
(您的i
或y
)的广告。然后开始对它们进行排序,然后它只取第一个结果。
答案 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();