1

我有一个 MyPersonObjects 的 List<>。该列表是我可以分配某些东西的人的列表。在此列表中,我包括我自己(因为任务可以分配给我 - 通常是)。

所以,我想确保自己在列表的顶部。我知道我的 personId,这是我的 person 对象的一个​​属性 - 所以有没有办法对列表进行排序,以确保我是第一个,然后是其余的,按姓氏字母顺序排列(这是我的对象的另一个属性)

4

2 回答 2

6

您可以通过两个单独的标准对列表进行OrderBy排序,如果值相等(除您之外的所有人),则将是主要的排序顺序ThenBy

personList.OrderBy(x => x.Id == myId ? 0 : 1)
           .ThenBy(x => x.Surname);
于 2012-08-26T06:50:21.550 回答
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))
于 2012-08-26T06:38:51.157 回答