C# 构造函数中的OrderBy
我正在推导可观测集合,并希望在构造函数中有where条件和orderby 以下条件适用,但我无法使用orderby:( 这是毫无问题的, 但当我试着这样称呼它时:C# 构造函数中的OrderBy,c#,.net,C#,.net,我正在推导可观测集合,并希望在构造函数中有where条件和orderby 以下条件适用,但我无法使用orderby:( 这是毫无问题的, 但当我试着这样称呼它时: new CustomCollection<TestClass>(SourceCollection, x => x.Price == 2.50, x => x.SortOrder); newcustomcollection(SourceCollection,x=>x.Price==2.50,x=>x.SortO
new CustomCollection<TestClass>(SourceCollection, x => x.Price == 2.50, x => x.SortOrder);
newcustomcollection(SourceCollection,x=>x.Price==2.50,x=>x.SortOrder);
我收到以下消息
无法将表达式类型“string”转换为返回类型“TestClass”
既然我的情况很糟糕,那有什么意义呢
Func<TModel, TModel> condition
Func条件
哪一个是两次指定的TestClass,当我查看OrderBy实现时,我可以看到TSource和TKey,但是在我的示例中如何指定TKey呢
希望您能帮助我。您需要添加一个新的泛型参数来表示
orderby
选择器映射到的类型。在您的示例中,选择器被强制选择与模型对象本身类型相同的内容,但您实际上并不希望这样
public class CustomCollection<TModel, TSortKey> : ObservableCollection<TModel>
where TModel : EntityBaseClass
{
private readonly Func<TModel, bool> _condition;
private readonly Func<TModel, TSortKey> sortSelector;
public CustomCollection(ObservableCollection<TModel> source,
Func<TModel, bool> condition,
Func<TModel, TSortKey> sortSelector)
: base(source.Where(condition).OrderBy(sortSelector))
{
_condition = condition;
this.sortSelector = sortSelector;
}
}
公共类CustomCollection:ObservableCollection
其中TModel:EntityBaseClass
{
私有只读函数条件;
专用只读函数排序选择器;
公共CustomCollection(ObservableCollection来源,
Func条件,
Func排序选择器)
:base(source.Where(condition).OrderBy(sortSelector))
{
_条件=条件;
this.sortSelector=sortSelector;
}
}
您需要添加一个新的泛型参数,以表示orderby
的选择器映射到的类型。在您的情况下,选择器将被迫选择与模型对象本身类型相同的内容,但实际上您并不需要这样做
public class CustomCollection<TModel, TSortKey> : ObservableCollection<TModel>
where TModel : EntityBaseClass
{
private readonly Func<TModel, bool> _condition;
private readonly Func<TModel, TSortKey> sortSelector;
public CustomCollection(ObservableCollection<TModel> source,
Func<TModel, bool> condition,
Func<TModel, TSortKey> sortSelector)
: base(source.Where(condition).OrderBy(sortSelector))
{
_condition = condition;
this.sortSelector = sortSelector;
}
}
公共类CustomCollection:ObservableCollection
其中TModel:EntityBaseClass
{
私有只读函数条件;
专用只读函数排序选择器;
公共CustomCollection(ObservableCollection来源,
Func条件,
Func排序选择器)
:base(source.Where(condition).OrderBy(sortSelector))
{
_条件=条件;
this.sortSelector=sortSelector;
}
}
更改您的orderby
Func
以返回对象
:
Func<TModel, object> orderBy
Func orderBy
该方法足够聪明,可以在这样的情况下工作(假设您的密钥实现了
IComparable
)。与添加另一个通用类型(如Servy的解决方案)相比,最大的缺点是您不能指定一个强类型的icomparaer
)(您必须指定一个在比较之前强制转换的i比较程序。更改您的orderby
Func
以返回对象
:
Func<TModel, object> orderBy
Func orderBy
该方法足够聪明,可以在这样的情况下工作(假设您的密钥实现了IComparable
)。与添加另一个通用类型(如Servy的解决方案)相比,最大的缺点是您不能指定一个强类型的icomparaer
)(您必须指定一个在比较之前强制转换的IComparer
。因此,我必须使用新的CustomCollection(..)进行初始化;或者?@RandRandom第二个类型参数应该是您正在排序的对象的类型,而不是您的模型的类型(除非您正在排序)。您也可以创建泛型工厂方法,而不是使用构造函数,这样您就可以利用泛型类型推断。您能否提供所提到的替代方案(泛型工厂)的解决方案?@RandRandom我想你可以自己解决。你所需要做的就是创建一个静态方法,该方法与这个类具有相同的泛型参数,与构造函数具有相同的参数;它的实现只需要将值传递给这个构造函数并返回该值。如果我说“请相当”,它会有帮助吗?Bec因为我没有真正理解你的意思sry。有了这个,我被迫用new CustomCollection(..)初始化;或者?@RandRandom第二个类型参数应该是你正在排序的对象的类型,而不是你的模型的类型(除非那是你正在排序的对象)。您也可以创建泛型工厂方法,而不是使用构造函数,这样您就可以利用泛型类型推断。您能否提供所提到的替代方案(泛型工厂)的解决方案?@RandRandom我想你可以自己解决。你所需要做的就是创建一个静态方法,该方法与这个类具有相同的泛型参数,与构造函数具有相同的参数;它的实现只需要将值传递给这个构造函数并返回该值。如果我说“请相当”,它会有帮助吗?Bec因为我没有真正理解你的意思。@downvoter:想解释一下吗?否决票来得出乎意料的快。速度比我预期的人类要快——当然比人类能够读懂我的答案并知道它是否值得否决票的速度还要快。@downvoter:想解释一下吗?否决票来得出乎意料的快。速度比我预期的人类要快当然,比一个人读到我的答案并知道它是否值得投反对票还要快。
Func<TModel, object> orderBy