C# 扩展方法对父对象中的列表进行排序 公共类人物 { 公共字符串名称{get;set;} 公共电子邮件{get;set;} } 公共类电子邮件 { 公共字符串desc{get;set;} } 公共静态IEnumerable排序(此IEnumerable源、字符串sortExpression、bool desc) { var param=Expression.Parameter(typeof(T),string.Empty); 尝试 { var property=Expression.property(param,sortExpression); var sortLambda=Expression.Lambda(Expression.Convert(property,typeof(object)),param); 如果(描述) { 返回source.AsQueryable().OrderByDescending(sortLambda); } 返回source.AsQueryable().OrderBy(sortLambda); } 捕获(异常) { 返回源; } } List vet=新列表(); 人员p=新人员{name=“aaa”,电子邮件=新电子邮件{desc=”bbb@aaa.com" } }; Person pp=new Person{name=“bbb”,email=new email{desc=”aaa@aaa.com" } }; 兽医添加(p); 审核添加(pp); 检查排序(“名称”,正确)//作品 vet.Sort(“email.desc”,true)//不起作用
有人可以帮我吗?您可能需要考虑另一种方法,该方法使用自定义比较器对象进行比较。然后,您可以为用户编写一个自定义比较器,根据他们的电子邮件地址进行比较。如果需要此功能,请查看ScottGu在网站上的文章。我相信它会满足你的要求 虽然Lambda是类型安全的,但有时您可能希望动态生成查询,而不是使用用户可以排序的所有可能的组合 编辑 我修正了你的方法。基本上,您需要为每个成员访问创建一个表达式C# 扩展方法对父对象中的列表进行排序 公共类人物 { 公共字符串名称{get;set;} 公共电子邮件{get;set;} } 公共类电子邮件 { 公共字符串desc{get;set;} } 公共静态IEnumerable排序(此IEnumerable源、字符串sortExpression、bool desc) { var param=Expression.Parameter(typeof(T),string.Empty); 尝试 { var property=Expression.property(param,sortExpression); var sortLambda=Expression.Lambda(Expression.Convert(property,typeof(object)),param); 如果(描述) { 返回source.AsQueryable().OrderByDescending(sortLambda); } 返回source.AsQueryable().OrderBy(sortLambda); } 捕获(异常) { 返回源; } } List vet=新列表(); 人员p=新人员{name=“aaa”,电子邮件=新电子邮件{desc=”bbb@aaa.com" } }; Person pp=new Person{name=“bbb”,email=new email{desc=”aaa@aaa.com" } }; 兽医添加(p); 审核添加(pp); 检查排序(“名称”,正确)//作品 vet.Sort(“email.desc”,true)//不起作用,c#,list,sorting,C#,List,Sorting,有人可以帮我吗?您可能需要考虑另一种方法,该方法使用自定义比较器对象进行比较。然后,您可以为用户编写一个自定义比较器,根据他们的电子邮件地址进行比较。如果需要此功能,请查看ScottGu在网站上的文章。我相信它会满足你的要求 虽然Lambda是类型安全的,但有时您可能希望动态生成查询,而不是使用用户可以排序的所有可能的组合 编辑 我修正了你的方法。基本上,您需要为每个成员访问创建一个表达式 public class Person { public string name { get; s
public class Person
{
public string name { get; set; }
public Email email { get; set; }
}
public class Email
{
public string desc { get; set; }
}
public static IEnumerable<T> Sort<T>(this IEnumerable<T> source, string sortExpression, bool desc)
{
var param = Expression.Parameter(typeof(T), string.Empty);
try
{
var property = Expression.Property(param, sortExpression);
var sortLambda = Expression.Lambda<Func<T, object>>(Expression.Convert(property, typeof(object)), param);
if (desc)
{
return source.AsQueryable<T>().OrderByDescending<T, object>(sortLambda);
}
return source.AsQueryable<T>().OrderBy<T, object>(sortLambda);
}
catch (ArgumentException)
{
return source;
}
}
List<Person> vet = new List<Person>();
Person p = new Person { name = "aaa", email = new Email { desc = "bbb@aaa.com" } };
Person pp = new Person { name = "bbb", email = new Email { desc = "aaa@aaa.com" } };
vet.Add(p);
vet.Add(pp);
vet.Sort("name",true); //works
vet.Sort("email.desc",true) // doesnt work
公共静态IEnumerable排序(此IEnumerable源代码,字符串sortExpression,bool desc)
{
var param=Expression.Parameter(typeof(T),string.Empty);
尝试
{
var fields=sortExpression.Split('.');
表达式属性=null;
表达式parentParam=param;
foreach(字段中的变量字段)
{
property=Expression.property(parentParam,field);
parentParam=属性;
}
变量sortLambda=
Lambda(
Expression.Convert(property,typeof(object)),param);
如果(描述)
{
返回source.AsQueryable()。
OrderByDescending(sortLambda);
}
返回source.AsQueryable()。
订购人(索特拉姆达);
}
捕获(异常)
{
投掷;
}
}
public static IEnumerable<T> Sort<T>(this IEnumerable<T> source, string sortExpression, bool desc)
{
var param = Expression.Parameter(typeof(T), string.Empty);
try
{
var fields = sortExpression.Split('.');
Expression property = null;
Expression parentParam = param;
foreach (var field in fields)
{
property = Expression.Property(parentParam, field);
parentParam = property;
}
var sortLambda =
Expression.Lambda<Func<T, object>>(
Expression.Convert(property, typeof(object)), param);
if (desc)
{
return source.AsQueryable<T>().
OrderByDescending<T, object>(sortLambda);
}
return source.AsQueryable<T>().
OrderBy<T, object>(sortLambda);
}
catch (ArgumentException)
{
throw;
}
}