パネルのリストをy値でソートしています。このように構造化されている理由の詳細については、my question from earlierを参照してください。短いストーリーでは、このリストは、位置0に最も高いパネル、位置1にそれより下のパネルなど、最後の位置の最後のパネルまで下がっています。私は高さ0に最も近いパネルのインデックスを見つける必要があるので、私はパネルがあるかを知るパネルのリストをバイナリ検索する方法
Panel p = panelList[someIndex];
int panelHeight = p.Top + p.Parent.Top - p.Parent.Margin.Top;
//The above line guarantees that the first panel (index 0) has y-coordinate 0 when scrolled all the way up,
//and becomes negative as the user scrolls down.
//the second panel starts with a positive y-coordinate, but grows negative after the user scrolls past the top of that page
//and so on...
:私は、y座標、私のリンク質問から適応コード行を使用して、各パネルのをアクセスしていますが現在、またはそのページ上に非常に近いところにあります。したがって、私はスタックされているList.BinarySearch()メソッドを使用しようとしています。私はBinarySearchのプロパティを利用して、値がリスト内に存在する場合に値を返すことを望んでいます。そのようにすれば、高さ0のパネルを検索できます(見つからないと思っています)が、それに最も近い要素(y = 24またはy = -5のようなもの)を見つけて、それがパネルです現時点でレンダリングされています。
バイナリ検索を使用すると、<や>操作を定義したIComparerを指定できますので、私はこのクラス書いた:
class PanelLocationComparer : IComparer<Panel>
{
public int Compare(Panel x, Panel y)
{
//start by checking all the cases for invalid input
if (x == null && y == null) { return 0; }
else if (x == null && y != null) { return -1; }
else if (x != null && y == null) { return 1; }
else//both values are defined, compare their y values
{
int xHeight = x.Top + x.Parent.Top - x.Parent.Margin.Top;
int yHeight = y.Top + y.Parent.Top - y.Parent.Margin.Top;
if (xHeight > yHeight)
{
return 1;
}
else if (xHeight < yHeight)
{
return -1;
}
else
{
return 0;
}
}
}
}
動作しない、と私は2つを比較するので、それがあることを今実現していますどのような値を探しているのか、実際にはy値= 0であるかどうかを気にする必要はありません。IComparerでこれを実装する方法はありますか、これを行う方法はありますか組み込みのBinarySearchを使用した検索のタイプ?
いつも私のPanelリストと同じ長さの新しいListを作成し、その中にy値をコピーしてから、このintリストを0で検索してみましたが、その作成、検索、破棄それらがスクロールするたびにリストはパフォーマンスを傷つけ、バイナリ検索のポイントを奪います。
私の質問はalso related to this oneですが、この状況ではアクセスできない組み込みの比較方法を最終的に使用するため、どのように調整するのか分かりませんでした。
を、私はそれに似た何かをやってしまいました。情報のおかげで! – Cody