如何在列表<g> </g>上执行上一项和下一项

时间:2010-11-02 21:37:00

标签: asp.net list

我有一个名为Person的类,它包含各种属性,如名字,姓氏等。

我有一个包含n个Person实例的List。

List<Person> lstPerson = new List<Person>();

我需要做的是搜索给定人员的lstPerson,然后找到该人然后获取相对于该人在lstPerson中的项目位置的前一个和下一个人。

Person p = lstPerson.Find(delegate(Person o) { return o.FirstName == "Joe"; });

// Then use an accessor to get the previous and next persons
Person prevPerson = p.Previous();
Person nextPerson = p.Next();

有没有比我上面提到的更好的方法?我不喜欢上述解决方案是我必须在当时构建上一个和下一个指针我建立了人员名单。

3 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

int personIndex = lstPerson.FindIndex(delegate(Person o) { return o.FirstName == "Joe" });
Person p = lstPerson[personIndex];
// verify that personIndex+1 and personIndex-1 still fall within the list
Person prevPerson = lstPerson[personIndex-1];
Person nextPerson = lstPerson[personIndex+1];

答案 1 :(得分:1)

嗯......为什么不简单地使用LinkedList class? 它内置了Next和Previous。

答案 2 :(得分:0)

你可以这样做,跳过元素,直到下一个元素匹配或者它已遍历整个列表:

var list = (new List<Person>() { null }).Concat(lstPerson);
var p = list.SkipWhile((x, index) => { var n = list.ElementAtOrDefault(index + 1); return n == null || n.FirstName != name; }).Take(3);

Person previous = p.FirstOrDefault();
Person person = p.ElementAtOrDefault(1);
Person next = p.ElementAtOrDefault(2);

虽然这(类似于@ marcind的回答)可能更清楚:

Person person = lstPerson.Find(p => p.FirstName == name);
Person previous = null;
Person next = null;

if (person != null)
{
    int index = lstPerson.IndexOf(person);
    previous = lstPerson.ElementAtOrDefault(index - 1);
    next = lstPerson.ElementAtOrDefault(index + 1);
}