[英]Sorting list of Objects using LINQ and private IComparer?
My assignment is to have a functionality which enables app user to sort RegisteredUser
objects according to their filed/property values.我的任务是拥有一个功能,使应用程序用户能够根据其归档/属性值对
RegisteredUser
对象进行排序。
Assistant
class inherits RegisteredUser
. Assistant
class 继承RegisteredUser
。 I would like somehow to be able to utilize lambdas
and LINQ
and to sort List<Assistants>
.我希望能够以某种方式利用
lambdas
和LINQ
并对List<Assistants>
进行排序。 Is there a way to achieve this?有没有办法做到这一点?
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!");
}
}
}
My point of reference was How to use IComparer .我的参考点是如何使用 IComparer 。 I was trying different things, non worked.
我正在尝试不同的东西,没有工作。
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 I am new to programming and c# PS我是编程新手和c#
try this using Linq and lambdas:使用 Linq 和 lambda 试试这个:
List<RegisteredUser> l = new List<RegisteredUser>();
l.Add(a);
l.Add(f);
l.Add(c);
var sortedList = l.OrderBy(x => x.Name).ToList();
This is a simple implementation of IComparable
:这是
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
{
}
This is how to use it:这是如何使用它:
var users = new List<RegisteredUser>();
users.Add(new Assistant() { Name = "John" });
users.Add(new Assistant() { Name = "Joe" });
users.Sort();
The sorting method must have access to your implementation of IComparer
, that means nameFieldComparator
needs to be a public class
in this case.排序方法必须能够访问您的
IComparer
实现,这意味着在这种情况下nameFieldComparator
需要是public class
。
I've found this article tremendously helpful!我发现这篇文章非常有帮助!
Multilevel Sorting with IComparable and IComparer 使用 IComparable 和 IComparer 进行多级排序
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.