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);
}

泛型委托的要点是允许它持有不同具体类型的方法;不允许它保存本身是通用的方法。

如果你想重用你的方法,你可以将它修改为 take Control(which both TextBoxand Labelinherit); List<Label>.Sort由于委托协方差,您仍然可以将其传递给。


如果您使用.Net < 4,它没有委托协方差,您可以通过向方法添加约束来按照自己的方式进行操作,以便它知道T可以是什么:

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

您也可以简单地用一行 LINQ 替换所有代码:

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