リストコレクションには特定の順序でデータが格納されています(この順序は変更できません)。このリストにはエンティティタイプオブジェクトが含まれています。リストの要素の最適な位置を見つける
リストの最初の作成後、別のデータソースからのオブジェクトを少し挿入する必要があります。これらのオブジェクトは、ソートが正しいように、特定の位置に挿入する必要があります。例えば
初期リストは要素を以下している場合
- AAA
- AAB
- AAC
- ACC が
- ADA
初期集団の後、私は「ABBを挿入したいです要素の場合、3〜4の間に挿入する必要があります。
私は新しい要素の正しい位置を見つける次の方法があります。
private static int FindPositionForArticle(string word)
{
string key = word.ToLower();
for (int i = word.Length; i >= 0; i--)
{
if(i < word.Length)
key = key.Remove(i, 1);
int pos = 0;
int insertPos = 0;
foreach(ArticleEntity article in list)
{
if(article.Text.ToLower().StartsWith(key))
insertPos = pos;
else if (!article.Text.ToLower().StartsWith(key) && insertPos > 0)
return insertPos++;
pos++;
}
}
return 0;
}
この方法の背後にある目的のアイデア:挿入する必要が
テイク「言葉」と「言葉」
と同じ名前を持つ要素の位置を見つけようとした場合何も見つかりませんでした。最後の文字を「単語」から削除し、再度検索してください。
ベストポジションが見つかるまで、最後の文字の削除を繰り返します。
残念ながら私のメソッドにはバグがあります(間違って実装されています)。現在のところ、私の方法は、最良のポジションは0であることを示唆していますが、これは全く間違っています。
あなたは私のサンプルコードでプレイしたい場合はあなたがでそれをダウンロードすることがあります。
http://dl.getdropbox.com/u/204110/FindPosition.cs.txt
は、事前にありがとうございました。
問題は、私のリストが実際に パブリッククラスArticleEntityCollectionである:のObservableCollection は私が –
うん、残念ながら、のObservableCollectionはBinarySearchを実装していない単純なリストに自分のコードをリファクタリングする必要がありおそれ。観測可能な機能が本当に必要な場合は、常にリストから派生し、リストが変更されたことを通知するイベントを発生させるadd/remove関数をオーバーライドすることができます。 –
私はリストにリファクタリングしました。 ObservableCollection機能を使用していないため。あなたのソリューションは正常に動作しました。 –