Linq,迫使项目成为第一名?

时间:2012-08-26 06:31:54

标签: linq

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

所以,我想确保自己处于榜单的首位。我知道我的personId,这是我的person对象的属性 - 所以有没有办法订购列表以确保我是第一个,然后其余的,按字母顺序by surname(这是我的对象的另一个属性)

2 个答案:

答案 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))