我有一个对象列表。我有一个值,不在列表中,但想找到相应的元素,该值适合。基本上是上一个和下一个元素,就好像这个值是列表的一部分。
var previous = 0;
var next = 0;
decimal Value = 45M;
List<MileStone> items = new List<MileStone>();
items.Add(new MileStone() { CheckPoint = 0, Distance = 15.4M});// i = 0
items.Add(new MileStone() { CheckPoint = 20, Distance = 24.8M});// i = 1
items.Add(new MileStone() { CheckPoint = 40, Distance = 39.7M});// i = 2
items.Add(new MileStone() { CheckPoint = 60, Distance = 59.3M});// i = 3
items.Add(new MileStone() { CheckPoint = 80, Distance = 80.1M});// i = 4
在此示例中,'Value'= 45,因此适合项目[2]和项目[3]。 期望的结果是,相邻值的新列表:
List<MileStone> items2 = new List<MileStone>();
items2.Add(items[2]);
items2.Add(items[3]);
如果'Value'= 10,则items2列表中应该只有一个元素,因为之前没有案例。
List<MileStone> items2 = new List<MileStone>();
items2.Add(items[0]);
我想使用LINQ Lambda表达式找到一个优雅,漂亮的解决方案。
我可以使用for循环找到索引,然后将所需的元素添加到items2列表中,但希望找到LINQ方法。
欢迎任何想法! 谢谢!
答案 0 :(得分:0)
如果你真的想使用Linq,一种方法是按Distance
属性排序列表,然后查找距离小于Value
的最后一项和第一项距离大于Value
,并将它们添加到列表中。
这是一个帮助方法:
private static List<MileStone> GetNeighboringItems(decimal value,
List<MileStone> milestones)
{
var neighbors = new List<MileStone>();
if (milestones == null || milestones.Count == 0) return neighbors;
var orderedList = milestones.OrderBy(m => m.Distance).ToList();
var lesser = orderedList.LastOrDefault(m => m.Distance < value);
var greater = orderedList.FirstOrDefault(m => m.Distance > value);
if (lesser != null) neighbors.Add(lesser);
if (greater != null) neighbors.Add(greater);
return neighbors;
}
然后,您可以为Value = 45
和Value = 10
private static void Main()
{
List<MileStone> items = new List<MileStone>
{
new MileStone {CheckPoint = 0, Distance = 15.4M},
new MileStone {CheckPoint = 20, Distance = 24.8M},
new MileStone {CheckPoint = 40, Distance = 39.7M},
new MileStone {CheckPoint = 60, Distance = 59.3M},
new MileStone {CheckPoint = 80, Distance = 80.1M}
};
Console.WriteLine("Neighbors of 45: {0}",
string.Join(", ", GetNeighboringItems(45, items)));
Console.WriteLine("Neighbors of 10: {0}",
string.Join(", ", GetNeighboringItems(10, items)));
Console.Write("\nDone!\nPress any key to exit...");
Console.ReadKey();
}
<强>输出强>
注意强>
我在ToString
课程上覆盖了MileStone
,因此在写入控制台时会为每个项目显示Distance
:
public class MileStone
{
public int CheckPoint { get; set; }
public decimal Distance { get; set; }
public override string ToString()
{
return Distance.ToString();
}
}