重要度が0の結果が大量に返された場合、ひとつひとつ重要度を設定するのは面倒です。そこで表示されている順に重要度を自動で設定します。そのとき 5 おきに値を設定するので必要なものだけ適切な値を設定することで並べ直すことができます。それから重要度順にソートするときも単に重要度が大きい順に並べるだけでなく、5 おきに重要度の値を設定します。
自動で値を設定するときは重要度0のものに5きざみで初期値を与え、すでに0以外の値が設定されているものはこれにあわせて適切な値に変更します。最初から重要度が1以上だったものを重要度が小さい順に並べ替え、重要度0のものに与えた初期値の最大値から値を「5」間隔で増やしていけば再設定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
public partial class Form2 : Form { private void MenuItemSetImportances_Click(object sender, EventArgs e) { // 現在選択されているアイテムの情報が影響を与えないようにSelectedPathプロパティに空文字列を設定する。 // 同時に SaveOldData()も実行される。 SelectedPath = ""; Form1 f = (Form1)this.Owner; List<FileTag> fileTags = f.FileTags.Where(x => x.Text.IndexOf(Keyword) != -1).ToList(); fileTags = fileTags.OrderByDescending(x => x.GetImportance(Keyword)).ToList(); int max = fileTags.Max(x => x.GetImportance(Keyword)); List<FileTag> zeroFileTags = fileTags.Where(x => x.GetImportance(Keyword) == 0).ToList(); List<FileTag> notZeroFileTags = fileTags.Where(x => x.GetImportance(Keyword) != 0).ToList(); // 重要度0のものに初期値を与える int zoroCount = zeroFileTags.Count; zeroFileTags = zeroFileTags.OrderBy(x => x.FilePath).ToList(); // 間隔は「5」とする int score = 5 * zoroCount; foreach(FileTag tag in zeroFileTags) { tag.SetImportance(Keyword, score); score -= 5; } // 最初から重要度が1以上だったものも「5」間隔で重要度を再設定する notZeroFileTags = notZeroFileTags.OrderBy(x => x.GetImportance(Keyword)).ToList(); score = 5 * zoroCount + 5; foreach(FileTag tag in notZeroFileTags) { tag.SetImportance(Keyword, score); score += 5; } SearchFileTags(Keyword); } } |
メニューで[重要度順に並べ替える]が選択されたときの処理も以下のように変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public partial class Form2 : Form { private void MenuItemSort_Click(object sender, EventArgs e) { // 現在選択されているアイテムの情報が影響を与えないようにSelectedPathプロパティに空文字列を設定する。 // 同時に SaveOldData()も実行される。 SelectedPath = ""; Form1 f = (Form1)this.Owner; List<FileTag> fileTags = f.FileTags.Where(x => x.Text.IndexOf(Keyword) != -1).ToList(); List<FileTag> notZeroFileTags = fileTags.Where(x => x.GetImportance(Keyword) != 0).ToList(); // 最初から重要度が1以上だったものだけ「5」間隔で重要度を再設定する notZeroFileTags = notZeroFileTags.OrderBy(x => x.GetImportance(Keyword)).ToList(); int score = 5; foreach(FileTag tag in notZeroFileTags) { tag.SetImportance(Keyword, score); score += 5; } SearchFileTags(Keyword); } } |