我有一个List<> MyPersonObjects。该列表是我可以分配内容的人员列表。在这个列表中,我包括我自己(因为任务可以分配给我 - 通常是)。
所以,我想确保自己处于榜单的首位。我知道我的personId,这是我的person对象的属性 - 所以有没有办法订购列表以确保我是第一个,然后其余的,按字母顺序by surname(这是我的对象的另一个属性)
答案 0 :(得分:6)
您可以按两个单独的条件对列表进行排序,OrderBy
将是主要排序顺序,如果值相等(除了您之外的所有标准均为1),则使用ThenBy
。
personList.OrderBy(x => x.Id == myId ? 0 : 1)
.ThenBy(x => x.Surname);
答案 1 :(得分:3)
一种方法是使用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))