Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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# 如何使这种通用方法更灵活?_C#_Generics_Anonymous Types - Fatal编程技术网

C# 如何使这种通用方法更灵活?

C# 如何使这种通用方法更灵活?,c#,generics,anonymous-types,C#,Generics,Anonymous Types,我正在使用一个库(具体来说是Gtk中的TreeView),它允许您通过传递一个比较两行的函数进行排序。函数签名的简化版本可能如下所示: int SomeSortFunc (Foo foo1, Foo foo2) { // Return -1 if foo1 < foo2, 0 if foo1 == foo2, 1 if foo1 > foo2 } int SortFunc<T> (Foo foo1, Foo foo2, params Func<Foo, T

我正在使用一个库(具体来说是Gtk中的TreeView),它允许您通过传递一个比较两行的函数进行排序。函数签名的简化版本可能如下所示:

int SomeSortFunc (Foo foo1, Foo foo2)
{
    // Return -1 if foo1 < foo2, 0 if foo1 == foo2, 1 if foo1 > foo2
}
int SortFunc<T> (Foo foo1, Foo foo2, params Func<Foo, T> [] selectors)
    where T : IComparable<T>
{
    return selectors
        .Select (s => s (foo1).CompareTo (s (foo2)))
        .FirstOrDefault (i => i != 0);
}

// Compare by SomeString, then by SomeInt, then by SomeBar
int SomeSortFunc (Foo foo1, Foo foo2)
{
    // Won't compile, because String, Int, and Bar are all different types.
    return SortFunc (foo1, foo2, f => f.SomeString, f => f.SomeInt, f => f.SomeBar);
}
这不会编译,因为
Func
中的
t
对于
String
Int
Bar:IComparable
(换句话说,无法解析
SortFunc
中的
t


有没有办法编写这个函数,使每个选择器都可以返回不同的类型,只要每个类型
SomeType
实现
IComparable

我会简化它,只接受返回非泛型
IComparable
的函数。现在,您可以传入返回原语的函数,而无需计算函数实际需要的泛型类型参数的数量,因为它确实需要提供的每个函数的类型参数

int SortFunc(Foo foo1, Foo foo2, params Func<Foo, IComparable>[] selectors)
int-SortFunc(Foo-foo1、Foo-foo2、params-Func[]选择器)

我会简化它,只接受一个返回非泛型
I可比较的
的函数。现在,您可以传入返回原语的函数,而无需计算函数实际需要的泛型类型参数的数量,因为它确实需要提供的每个函数的类型参数

int SortFunc(Foo foo1, Foo foo2, params Func<Foo, IComparable>[] selectors)
int-SortFunc(Foo-foo1、Foo-foo2、params-Func[]选择器)

啊,这很有道理,而且似乎效果很好。我失去了一点类型安全性,但这绝对是值得的。啊,这很有道理,而且似乎工作得很完美。我失去了一点类型安全性,但绝对值得。