1

Sort(Comparison)メソッドのオーバーロードを再利用して、ラベルとテキストボックスの両方をtabIndexで並べ替えることができるかどうか疑問に思っています。私はすでに試しましたが、動作させることができませんでした。どんな助けでもいただければ幸いです。

foreach(Control control in gbUserInputs.Controls)
        {
            if (control is Label)
            {
                inputLabels.Add((Label)control);
            }

            if (control is TextBox)
            {
                inputTxtboxes.Add((TextBox)control);
            }
        }

ソートメソッド呼び出し(これは機能しません)。

inputLabels.Sort(sortMyInputs<Label>);

ソート方法の過負荷。

private static int sortMyInputs<T>(T entry1, T entry2)
    {
        return entry1.TabIndex.CompareTo(entry2.TabIndex);
    }
4

1 に答える 1

1

一般的なメソッドを作成するべきではありません。

private static int CompareLabels(Label entry1, Label entry2)
{
    return entry1.TabIndex.CompareTo(entry2.TabIndex);
}

ジェネリックデリゲートのポイントは、さまざまな具象タイプのメソッドを保持できるようにすることです。それ自体が一般的なメソッドを保持できないようにします。

メソッドを再利用したい場合は、メソッドを変更して取得することができますControl(両方ともTextBox継承Labelします)。List<Label>.Sortデリゲート共分散のため、引き続きそれを渡すことができます。


デリゲート共分散を持たない.Net<4を使用している場合は、メソッドに制約を追加して、次のことができるようにすることで、自分のやり方でそれを行うことTができます。

private static int CompareLabels<T>(T entry1, T entry2) where T : Control
{
    return entry1.TabIndex.CompareTo(entry2.TabIndex);
}

すべてのコードを1行のLINQに置き換えることもできます。

inputLabels = gbUserInputs.Controls.OfType<Label>()
                                   .OrderBy(c => c.TabIndex)
                                   .ToList();
于 2012-05-31T11:52:23.123 に答える