在对象列表中查找相邻/相邻元素c#

时间:2018-03-01 06:53:44

标签: c# .net linq

我有一个对象列表。我有一个值,不在列表中,但想找到相应的元素,该值适合。基本上是上一个和下一个元素,就好像这个值是列表的一部分。

    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方法。

欢迎任何想法! 谢谢!

1 个答案:

答案 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 = 45Value = 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();
}

<强>输出

enter image description here

注意

我在ToString课程上覆盖了MileStone,因此在写入控制台时会为每个项目显示Distance

public class MileStone
{
    public int CheckPoint { get; set; }
    public decimal Distance { get; set; }
    public override string ToString()
    {
        return Distance.ToString();
    }
}