3

DB クエリからの long のリストがあります。リスト内の総数は常に偶数ですが、アイテムの数は数百になる場合があります。

リスト項目 [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;

線形検索が望ましくないほど十分なアイテムがある場合は、 a を使用しBinarySearchて次に大きなアイテムを見つけることができます。

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

item[1] を処理する準備ができたときに IEnumerable が item[0] を忘れてしまうため、LINQ はこの問題に最適ではない可能性があると考えています。

はい、これは新入生の 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 に答える