Сортировка списка объектов с использованием LINQ и частного IComparer? - PullRequest
1 голос
/ 24 октября 2019

Мое назначение - иметь функциональность, позволяющую пользователю приложения сортировать RegisteredUser объекты по значениям их полей / свойств.

Assistant класс наследует RegisteredUser. Я хотел бы как-нибудь иметь возможность использовать lambdas и LINQ и сортировать List<Assistants>. Есть ли способ добиться этого?

public abstract class RegisteredUser  
{
    protected int id;
    protected bool active;
    protected string name;

    //other fields and methods

    public static IComparer sortUsersByName(Order order)
    {
            return (IComparer)new nameFieldComparator(order);
    }

    private class nameFieldComparator : IComparer
    {
        private Order direction;

        public nameFieldComparator(Order direction)
        {
            this.direction = direction;
        }

        public int Compare(object x, object y)
        {
            if (x != null && y != null)
            {
                RegisteredUser user1 = (RegisteredUser)x;
                RegisteredUser user2 = (RegisteredUser)y;

                return (int)this.direction * String.Compare(user1.Name, user2.Name);

            }
            else throw new ArgumentNullException("Objects cannot be compared!");
        }
    }
}

Моя точка отсчета была Как использовать IComparer . Я пробовал разные вещи, не работал.

Assistant a = new Assistant();
a.SetId(5);
a.Active = true;
a.Name = "asdasd"; 

Assistant f = new Assistant();
f.SetId(6);
f.Active = true;
f.Name = "asdf";


Assistant c = new Assistant();
c.Name = "a";
c.SetId(2);

List<RegisteredUser> l = new List<RegisteredUser>();
l.Add(a);
l.Add(f);
l.Add(c);
//list.Sort((x, y) => RegisteredUser.sortUsersByName()); of course, doesn't work...
List<Assistant> l = l.OrderBy() //tried bunch of ideas, but cannot get the syntax right

PS Я новичок в программировании и c #

Ответы [ 3 ]

0 голосов
/ 24 октября 2019

Это простая реализация IComparable:

public abstract class RegisteredUser : IComparable
{
    public string Name { get; set; }

    // other properties


    public int CompareTo(object obj)
    {
        if (obj is RegisteredUser user)
            return this.Name.CompareTo(user.Name);

        return 1;
    }
}

public class Assistant : RegisteredUser
{

}

Вот как это использовать:

var users = new List<RegisteredUser>();
users.Add(new Assistant() { Name = "John" });
users.Add(new Assistant() { Name = "Joe" });

users.Sort();
0 голосов
/ 25 октября 2019

Метод сортировки должен иметь доступ к вашей реализации IComparer, что означает, что nameFieldComparator должно быть public class в этом случае.

0 голосов
/ 24 октября 2019

попробуйте это с помощью Linq и lambdas:

 List<RegisteredUser> l = new List<RegisteredUser>();
 l.Add(a);
 l.Add(f);
 l.Add(c);

 var sortedList = l.OrderBy(x => x.Name).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...