Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 与排序一起使用的泛型(比较<;T>;)_C# 4.0 - Fatal编程技术网

C# 4.0 与排序一起使用的泛型(比较<;T>;)

C# 4.0 与排序一起使用的泛型(比较<;T>;),c#-4.0,C# 4.0,我想知道是否有可能重用我的重载排序(比较)方法来按tabIndex对标签和文本框进行排序。我已经试过了,但没能成功。任何帮助都将不胜感激 foreach(Control control in gbUserInputs.Controls) { if (control is Label) { inputLabels.Add((Label)control); }

我想知道是否有可能重用我的重载排序(比较)方法来按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);
排序方法的重载

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

您不应该创建通用方法:

private static int CompareLabels(Label entry1, Label entry2)
{
    return entry1.TabIndex.CompareTo(entry2.TabIndex);
}
泛型委托的要点是允许它持有不同具体类型的方法;不允许它保存本身是泛型的方法

如果您想重用您的方法,可以将其修改为采用
控件
(这两个
文本框
标签
继承);由于代理协方差,您仍然可以将其传递到
List.Sort


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

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

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

inputLabels = gbUserInputs.Controls.OfType<Label>()
                                   .OrderBy(c => c.TabIndex)
                                   .ToList();
inputLabels=gbUserInputs.Controls.OfType()
.OrderBy(c=>c.TabIndex)
.ToList();

您不应该创建通用方法:

private static int CompareLabels(Label entry1, Label entry2)
{
    return entry1.TabIndex.CompareTo(entry2.TabIndex);
}
泛型委托的要点是允许它持有不同具体类型的方法;不允许它保存本身是泛型的方法

如果您想重用您的方法,可以将其修改为采用
控件
(这两个
文本框
标签
继承);由于代理协方差,您仍然可以将其传递到
List.Sort


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

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

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

inputLabels = gbUserInputs.Controls.OfType<Label>()
                                   .OrderBy(c => c.TabIndex)
                                   .ToList();
inputLabels=gbUserInputs.Controls.OfType()
.OrderBy(c=>c.TabIndex)
.ToList();

很抱歉,这可能是一个愚蠢的问题,但泛型委托从何而来?我还没有谈到LINQ,但是谢谢你把它包括进来。是的,我正在使用.NET4.0。非常感谢你的帮助far@HansRudel:
Sort()
进行一次
比较
,这是一次普通委托。我强烈建议您学习LINQ;它使这类代码大大缩短,可读性更高。(通常也更快)是的,好的。。。哦。这在我要做的事情清单上,但仍然有一些基本的事情我没有100%的速度。非常感谢您抽出时间回答我的问题,我真的很感激!抱歉,这可能是一个愚蠢的问题,但是一般委托是从哪里来的呢?我还没有谈到LINQ,但是谢谢你把它包括进来。是的,我正在使用.NET4.0。非常感谢你的帮助far@HansRudel:
Sort()
进行一次
比较
,这是一次普通委托。我强烈建议您学习LINQ;它使这类代码大大缩短,可读性更高。(通常也更快)是的,好的。。。哦。这在我要做的事情清单上,但仍然有一些基本的事情我没有100%的速度。非常感谢您抽出时间回答我的问题,我真的很感激!