gpt4 book ai didi

c# - 通用 Func 对不同类型的集合进行排序

转载 作者:行者123 更新时间:2023-11-30 15:39:42 25 4
gpt4 key购买 nike

我有很多类型的集合,我想按不同的属性对每个集合进行排序。例如IEnumerable<Employee>将按 Name 排序和 Age属性,和 IEnumerable<Department>将按 NumberOfEmployees 排序和 DepartmentName特性。我用 PaginatedList排序后对集合进行分页。

public class PaginatedList<T> : List<T>
{
public PaginatedList(IEnumerable<T> source, Int32 pageIndex, Int32 pageSize , Func<T,Object> orderBy)
{
this.AddRange(source.OrderBy(orderBy).Skip((PageIndex - 1) * PageSize).Take(PageSize));
}
}

请注意第 4 个参数,它是将传递给 OrderBy 扩展方法的排序委托(delegate)。

我正在使用通用方法生成这第四个元素

public Func<T, Object> SortingFactory<T>(String sortby) 
{
switch (typeof(T).ToString())
{
case "Employee":
switch(sortby)
{
case "Name":
return new Func<Employee,String>(delegate(Employee e) { return e.Name; });
break;
case "Age":
return new Func<Employee,Int32>(delegate(Employee e) { return e.Age; });
break;
}
break;
case "Department":
switch(sortby)
{
case "NumberOfEmployees":
return new Func<Department,Int32>(delegate(Department d) { return d.NumberOfEmployees; });
break;
case "DepartmentName":
return new Func<Department,String>(delegate(Department d) { return d.DepartmentName; });
break;
}
break;
}
}

但它给了我一个编译错误 Cannot implicitly convert type 'System.Func<Employee,String>' to 'System.Func<T,object>'

我还尝试将输出贴标为 Func<Object,Object>但我得到了同样的错误。

我犯了什么错,怎么办。

最佳答案

说我理解的很好

public class PaginatedList<T> : List<T>
{
public PaginatedList(IEnumerable<T> source, Int32 pageIndex, Int32 pageSize )
{
this.AddRange(GetOrderFor<T>().Skip((PageIndex - 1) * PageSize).Take(PageSize));
}
}

public static class Helpers
{

public static Func<T, object> GetSortExpression<T>(string sortExpressionStr)
{
var param = Expression.Parameter(typeof (T), "x");
var sortExpression = Expression.Lambda<Func<T, object>>(Expression.Convert(Expression.Property(param, sortExpressionStr), typeof(object)), param);
return sortExpression.Compile();
}

public static IOrderedEnumerable<T> GetOrderFor<T>(this IEnumerable<T> list)
{
switch (typeof (T).Name)
{
case "Employee":
return list.OrderBy(GetSortExpression<T>("Name")).ThenBy(GetSortExpression<T>("Age"));
case "Category":
return list.OrderBy(GetSortExpression<T>("Name")).ThenBy(GetSortExpression <T> ("Id"));
}
return null;
}
}

如果我误解了,我认为 GetSortExpression 方法的简单用法可以帮助您避免错误

case "Employee":
switch(sortby)
{
case "Name":
return Helpers.GetSortExpression<T>("Name");
case "Age":
return Helpers.GetSortExpression<T>("Age");
}

关于c# - 通用 Func<T,K> 对不同类型的集合进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10072250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com