امتداد أسلوب فرز قائمة داخل الكائن الأصل

StackOverflow https://stackoverflow.com/questions/802789

  •  03-07-2019
  •  | 
  •  

سؤال

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;
        }
    }

نصائح أخرى

وقد ترغب في التفكير في طريقة أخرى أن يأخذ الكائن المقارن مخصصة للقيام بهذه المقارنة. هل يمكن بعد ذلك إرسال المقارن مخصصة لشخص أن يقارنها بناء على عناوين بريدهم الإلكتروني.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top