Generic与Sort(Comparison <t>)</t>一起使用

时间:2012-05-31 11:50:45

标签: c#-4.0

我想知道是否可以重复使用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);
    }

1 个答案:

答案 0 :(得分:1)

你不应该制作通用方法:

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

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

如果您想重复使用自己的方法,可以对其进行修改,以便ControlTextBoxLabel都继承);由于代表协方差,您仍然可以将其传递给List<Label>.Sort


如果你正在使用.Net&lt; 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();