C# LINQ - 在两个属性之间的列表中查找对象

Jim*_*ski 1 c# linq

我以前没有使用过 LINQ,但我知道它的效率有多高。
我创建了一个带有对象的列表,您可以在下面看到:

public sealed class Item
{
    public long Start { private set; get; }
    public long End { private set; get; }
    public Item(string start, string end)
    {
        this.Start = Convert.ToInt64(start);
        this.End = Convert.ToInt64(end);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将填充DataSet包含大约 200k 个项目的 s。
现在,我想在属性“开始”和“结束”之间选择最佳的单个项目。

this.ItemList.Add(new Item(100000, 100002));
this.ItemList.Add(new Item(100003, 100006));
this.ItemList.Add(new Item(100007, 100012));
this.ItemList.Add(new Item(100013, 100026));
this.ItemList.Add(new Item(100027, 100065));
Run Code Online (Sandbox Code Playgroud)

从另一个工具中,我得到了值:100009

如何new Item(100007, 100012)使用 LINQ 取回对象?有没有人有什么建议?

Hei*_*nzi 5

听起来一个简单的Where查询就足够了:

long value = 100009;
var found = ItemList.Where(item => item.Start <= value && item.End >= value);
Run Code Online (Sandbox Code Playgroud)

这将产生一个IEnumerable<Item>包含所有匹配项的。您可以使用.First()/.FirstOrDefault()来获取第一个匹配项,或者继续过滤结果,直到获得您想要的项。

请注意,如果您确实有 200k 个条目,列表可能不是最有效的搜索数据结构(复杂度为 O(n))。如果性能是一个问题,您可能需要考虑使用SortedList二分搜索算法

  • @Grundy:这取决于他对“最佳”的定义:首先?最小间隔?最接近边界之一? (2认同)
  • @MVCDS:这是相反的:First 将抛出一个 `InvalidOperationException`,FirstOrDefault 将产生 null (如果你不小心的话,稍后可能会导致空引用异常)。 (2认同)