3

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

列表项 [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”),但可以被其他线程销毁/重新填充随时。
4

3 回答 3

1

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

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

bool isValid = index % 2 == 1;

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

var searchValue = data.BinarySearch(someValue);
if (searchValue < 0)
    searchValue = ~searchValue;

bool isValid = searchValue % 2 == 1;
于 2013-10-18T17:06:10.963 回答
1

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

public static bool IsGood<T>(List<T> list, T value)
{
    int index = list.BinarySearch(value);   
    return index >= 0 || index % 2 == 0;
}
于 2013-10-18T17:27:05.217 回答
1

我认为 LINQ 可能不是最适合这个问题,因为 IEnumerable 在准备处理 item[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 中的最佳方法”的问题,我深表歉意,但我觉得您确实在询问最佳性能方法。

于 2013-10-18T17:23:22.210 回答