امتداد أسلوب فرز قائمة داخل الكائن الأصل
سؤال
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
شخص ما يمكن أن تساعدني ؟
المحلول
إذا كنت تريد هذه الوظيفة تبدو في مقال ScottGu على ديناميكية Linq المكتبة.وأعتقد أنها سوف تفعل ما تريد.
في حين امدا هي نوع آمنة هناك أوقات عندما كنت قد تريد أن تولد على الطاير الاستعلام بدلا من الاضطرار كل تركيبة ممكنة التي يمكن للمستخدم نوع على سبيل المثال.
تحرير
أنا ثابت الأسلوب الخاص بك.في الأساس تحتاج إلى إنشاء تعبير كل الأعضاء الدخول.
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;
}
}
نصائح أخرى
وقد ترغب في التفكير في طريقة أخرى أن يأخذ الكائن المقارن مخصصة للقيام بهذه المقارنة. هل يمكن بعد ذلك إرسال المقارن مخصصة لشخص أن يقارنها بناء على عناوين بريدهم الإلكتروني.
لا تنتمي إلى StackOverflow