使用linq选择与另一个范围重叠的范围

时间:2018-11-16 15:13:31

标签: c# linq

我有一个包含许多“乐队”的列表,如下所示:

var bands = new List<Band>();

bands.Add(new Band(1, 12, 1, 100, 199, 100, 292));
bands.Add(new Band(1, 5, 1, 200, 1000, 100, 292));
bands.Add(new Band(6, 6, 1, 200, 2000, 100, 210));
bands.Add(new Band(7, 7, 1, 200, 2000, 100, 192));
bands.Add(new Band(8, 8, 1, 200, 2000, 100, 178));
bands.Add(new Band(9, 9, 1, 200, 2000, 100, 167));
bands.Add(new Band(10, 10, 1, 200, 2000, 100, 158));
bands.Add(new Band(11, 11, 1, 200, 2000, 100, 150.5));
bands.Add(new Band(12, 12, 1, 200, 999, 100, 140));
bands.Add(new Band(12, 18, 3, 1000, 3000, 100, 71.3));
bands.Add(new Band(24, 24, 6, 1000, 3000, 100, 71.3));

重要的列为4和5 -第一个波段值为100和199。

目前,我有一个查询,该查询根据一个参数选择一个或多个频段:

public static IEnumerable<Quote> ForAmount(int amount)
{
    return Repository.Bands
        .Where(x => amount >= x.MinAmount && amount <= x.MaxAmount)
        .YieldTerms(amount); // this does something with the selected data
}

但是,我想拉出属于低频段和高频段的频段。

新签名:

public static IEnumerable<Quote> ForAmount(int lowAmount, int highAmount)
{
    // Query
}

例如,低= 100,高= 500。

给出示例的高/低值,将选择以下波段(100-500与100-199重叠)。

bands.Add(new Band(1, 12, 1, 100, 199, 100, 292));

以下波段(100-500与200-2000重叠)也会如此。

bands.Add(new Band(1, 5, 1, 200, 1000, 100, 292));

我敢肯定,这很容易做到,但是我现在脑中有雾气,所以任何帮助都值得赞赏。

2 个答案:

答案 0 :(得分:2)

Repository.Bands
    .Where(x => x.MinAmount <= High && x.MaxAmount >= Low)

应该做

答案 1 :(得分:0)

我在dotnet提琴中演示了与您的示例相似的内容; https://dotnetfiddle.net/dHr2Nn

这应该工作。

public static IEnumerable<Quote> ForAmount(int lowAmount, int highAmount)
{
    return Repository.Bands
        .Where(x => x.MinAmount <= highAmount && x.MinAmount >= lowAmount) 
             || (x.MaxAmount >= lowAmount && x.MaxAmount <= highAmount))
        .YieldTerms(...); // this does something with the selected data
}