LINQ 查询确定输入是否在列表边界中

本文关键字:列表 边界 是否 输入 查询 LINQ | 更新日期: 2023-09-27 18:35:53

我有一个来自数据库查询的长整型列表。列表中的总数始终是偶数,但项目的数量可以是数百。

列表项 [0] 是"良好范围"的下边界,项 [1] 是该范围的上边界。项目 [1] 和项目 [2] 之间的数字范围被视为"错误范围"。

样本:

var seekset = new SortedList();
var skd= 500;
while( skd< 1000000 )
{
seekset.Add(skd, 0);
skd = skd+ 100;
}

如果将输入编号与列表项进行比较,如果输入编号在 500-600 或 700-800 之间,则将其视为"好",但如果在 600-700 之间,则被视为"坏"。

使用上面的示例,任何人都可以评论正确/快速的方法来确定数字 655 是否是"坏"数字,即不在任何良好的范围边界内(C#、.NET 4.5)?

  • 如果 SortedList 不是合适的容器(例如它需要是一个数组),我可以毫无问题地更改,该对象一旦填充就是静态的(小写"s"),但可以随时被其他线程销毁/重新填充。

LINQ 查询确定输入是否在列表边界中

假设列表已排序,并且每对限制都被视为"良好"值,则以下工作:

public static bool IsGood<T>(List<T> list, T value)
{
    int index = list.BinarySearch(value);   
    return index >= 0 || index % 2 == 0;
}

如果你只有几百个项目,那么它真的没有那么糟糕。 您可以使用常规List并进行线性搜索以查找该项目。 如果第一个较大项目的索引是偶数,那么它不好,如果它是奇数,那么它很好:

var index = data.Select((n, i) => new { n, i })
    .SkipWhile(item => someValue < item.n)
    .First().i;
bool isValid = index % 2 == 1;

如果您有足够的项目不需要线性搜索,则可以使用BinarySearch来查找下一个最大的项目。

var searchValue = data.BinarySearch(someValue);
if (searchValue < 0)
    searchValue = ~searchValue;
bool isValid = searchValue % 2 == 1;
我认为

LINQ 可能不适合这个问题,因为 IEnumerable 在准备处理项目[1] 时会忘记 item[0]。

是的,这是新生CS,但在这种情况下最快的可能只是

// untested code
Boolean found = false;
for(int i=0; i<seekset.Count; i+=2)
{
   if (valueOfInterest >= seekset[i] &&
       valueOfInterest <= seekset[i+1])
   {
       found = true;
       break;   // or return;
   }
}

抱歉没有直接回答您关于"Linq 中的最佳方法"的问题,但我觉得您实际上是在询问性能的最佳方法。