【问题标题】:C# LINQ - Find object in list between two propertiesC# LINQ - 在两个属性之间的列表中查找对象
【发布时间】:2016-05-27 20:17:05
【问题描述】:

我以前没有使用过 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);
    }
}

这将填充DataSets,其中包含大约 20 万个项目。
现在,我想在属性“开始”和“结束”之间选择最佳单项。

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));

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

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

【问题讨论】:

  • 如果给定的值适合两个项目,因为两者的差异相等怎么办?特别是当提供的值恰好在一个结束和下一个间隔开始之间时会发生什么?
  • 不清楚你的标准是什么 - 你想找到所有开始和结束都在两个任意值之间的对象吗?
  • 定义最佳。你的问题不清楚。

标签: c# linq


【解决方案1】:

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

long value = 100009;
var found = ItemList.Where(item => item.Start <= value && item.End >= value);

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

请注意,如果您确实有 200k 个条目,则 List 可能不是最有效的搜索数据结构(您的复杂度为 O(n))。如果性能是一个问题,您可能需要考虑using a SortedList and a binary search algorithm instead

【讨论】:

  • 似乎First 而是:我想选择最好的
  • @Grundy:这取决于他对“最佳”的定义:首先?最小间隔?最接近边界之一?
  • @Grundy:我修改了我的答案并提到了First 作为一个选项。
  • @MVCDS 实际上它避免了 InvalidOperationException。
  • @MVCDS:反之亦然:First 会抛出 InvalidOperationException,FirstOrDefault 会产生 null(如果你不小心的话,稍后可能会导致 null 引用异常)。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
相关资源
最近更新 更多