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

时间:2013-10-18 16:55:50

标签: c# .net linq

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

列表项[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”)但可以销毁/重新填充任何时候都可以通过其他线程。

3 个答案:

答案 0 :(得分:1)

如果你只有几百个项目,那么 那就不好了。您只需使用常规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;

答案 1 :(得分:1)

我认为LINQ可能不是最适合这个问题的,因为当它准备好处理项[1]时,IEnumerable会忘记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中的最佳方法”的问题而道歉,但我觉得你真的在询问最佳的绩效方法。

答案 2 :(得分:1)

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

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