【发布时间】:2019-10-24 12:30:38
【问题描述】:
我的任务是拥有一个功能,使应用用户能够根据 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!");
}
}
}
我的参考点是How to use 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
附:我是编程和 c# 新手
【问题讨论】:
-
@Izzy 您提供的链接中的可能解决方案与我想要实现的目标不兼容。你看我有私有 IComparable,现在不知道如何在一些 linq 表达式或 lambda 中调用它(通过公共方法)......
-
@MiljanPuletic 为什么要使用私有比较器,而不是简单的
OrderBy(x=>x.Name)?在任何情况下,OrderBy 都有一个接受 IComparer的重载。在您的情况下,这只是名称的字符串比较器 -
忽略这个问题,如果使用自定义
IComparer,您可以自己设置顺序是正确的做法(我同意不是),如果您想这样做有一些问题这里。首先,这不会编译,因为RegisteredUser没有Name属性(它有一个name字段,但它是受保护的,在IComparer中不可用)。此外,您正在创建一个IComparer,但如果您想将其提供给OrderBy(Func<TSource, TKey>, IComparer<TKey>),您需要一个IComarer<T>,在这种情况下为IComparer<RegisteredUser> -
@Izzy 你是对的。我将 NameComparator IComparer
放在单独的类中,当然是公开的,我会这样做:users.Sort(new NameComparator(Order.Ascending))。