首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型与排序(Comparison<T>)一起使用

泛型与排序(Comparison<T>)一起使用
EN

Stack Overflow用户
提问于 2012-05-31 19:50:45
回答 1查看 123关注 0票数 1

我想知道是否有可能重用我的sort (比较)方法的重载来按tabIndex对标签和文本框进行排序。我已经试过了,但我不能让它工作。任何帮助都将不胜感激。

代码语言:javascript
复制
foreach(Control control in gbUserInputs.Controls)
        {
            if (control is Label)
            {
                inputLabels.Add((Label)control);
            }

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

排序方法调用(这不起作用)。

代码语言:javascript
复制
inputLabels.Sort(sortMyInputs<Label>);

sort方法的重载。

代码语言:javascript
复制
private static int sortMyInputs<T>(T entry1, T entry2)
    {
        return entry1.TabIndex.CompareTo(entry2.TabIndex);
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-31 19:52:23

你不应该创建一个泛型方法:

代码语言:javascript
复制
private static int CompareLabels(Label entry1, Label entry2)
{
    return entry1.TabIndex.CompareTo(entry2.TabIndex);
}

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

如果您想重用您的方法,您可以修改它以获取Control ( TextBoxLabel都继承了它);由于委托协方差,您仍然可以将它传递给List<Label>.Sort

如果你使用的是.Net < 4,它没有委托协方差,你可以按照自己的方式通过向方法添加约束来实现,这样它就知道T可以是什么:

代码语言:javascript
复制
private static int CompareLabels<T>(T entry1, T entry2) where T : Control
{
    return entry1.TabIndex.CompareTo(entry2.TabIndex);
}

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

代码语言:javascript
复制
inputLabels = gbUserInputs.Controls.OfType<Label>()
                                   .OrderBy(c => c.TabIndex)
                                   .ToList();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10833030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档