我有一个 MyPersonObjects 的 List<>。该列表是我可以分配某些东西的人的列表。在此列表中,我包括我自己(因为任务可以分配给我 - 通常是)。
所以,我想确保自己在列表的顶部。我知道我的 personId,这是我的 person 对象的一个属性 - 所以有没有办法对列表进行排序,以确保我是第一个,然后是其余的,按姓氏字母顺序排列(这是我的对象的另一个属性)
我有一个 MyPersonObjects 的 List<>。该列表是我可以分配某些东西的人的列表。在此列表中,我包括我自己(因为任务可以分配给我 - 通常是)。
所以,我想确保自己在列表的顶部。我知道我的 personId,这是我的 person 对象的一个属性 - 所以有没有办法对列表进行排序,以确保我是第一个,然后是其余的,按姓氏字母顺序排列(这是我的对象的另一个属性)
您可以通过两个单独的标准对列表进行OrderBy
排序,如果值相等(除您之外的所有人),则将是主要的排序顺序ThenBy
。
personList.OrderBy(x => x.Id == myId ? 0 : 1)
.ThenBy(x => x.Surname);
一种方法是使用 Linq 按姓氏对列表进行排序,然后将自己删除并放回第一位:
var personList = db.MyPersonObjects.OrderBy(p => p.Surname).ToList();
var myself = personList.Single(p => p.Id == myselfId);
personList.Remove(myself);
personList.Insert(0, myself);
或者创建一个自定义比较器IComparer<MyPersonObject>
,其中的实现类似于:
public class PersonCompaper : IComparer<MyPersonObject>
{
private readonly int personId;
public PersonCompaper(int personId)
{
this.personId = personId;
}
public int Compare(MyPersonObject x, MyPersonObject y)
{
if (x.Id == personId && y.Id == personId)
return 0;
if (x.Id == personId)
return 1;
if (y.Id == personId)
return -1;
return string.Compare(x.Surname, y.Surname);
}
}
然后你在 OrderBy 中使用它
db.MyPersonObjects.OrderBy(p => p, new PersonCompaper(myselfId))