如何使用LINQ在List中移动next / previous?

时间:2013-05-02 12:41:04

标签: c# linq list

我有这堂课:

public class City
{
    public City()
    {
        //
        // TODO: Add constructor logic here
        //
    }
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string Image { get; set; }
}

这是我的清单:

List<City> list = new List<City>(){
new City{Id=1,Title="city1",Description=""},
new City{Id=2,Title="city2",Description=""},
new City{Id=3,Title="city3",Description=""},
new City{Id=4,Title="city4",Description=""}

}

如何使用LINQ移动下一个或在我的列表中移动前一个?

5 个答案:

答案 0 :(得分:6)

你想要ElementAt,它在逻辑上等同于使用列表索引器属性,并且可能比使用Skip&amp;在运行时获取,因为它包含一个特定的检查,以查看序列是否实现IList,如果是,它使用索引器,如果不是它迭代序列(类似于执行Skip(n).Take(1)

var nameList = List<string>{"Homer", "Marge", "Bart", "Lisa", "Maggie"};
IEnumerable<string> nameSequence = nameList;

secondFromList = nameList[1];
secondFromSequence = nameSequence.ElemenetAt(1);

IList由各种集合,数组等实现,而不仅仅是List<>

答案 1 :(得分:5)

不是真的LINQ,但我会建议像:

List<City> cityList;
public City Next(City current)
{
    int index = cityList.IndexOf(current);

    if (index < cityList.Count - 1)
        return cityList.ElementAt(index + 1);
    return current;
}

public City Previous(City current)
{
    int index = cityList.IndexOf(current);

    if (index >= 1)
        return cityList.ElementAt(index - 1);
    return current;
}

cityList.First()开始。

编辑:我必须同意其他人的观点,说明LINQ绝对是这项工作的错误工具。如果这不是绝对要求,只需对此问题使用常规索引。 LINQ实际上使解决方案比应该更加困难。

答案 2 :(得分:2)

从你的问题:

  

如何使用LINQ移动下一个或在我的列表中移动前一个?

以及您对@mattytommo(现已删除)答案的评论

  

例如,当我点击下一个时,我有两个按钮(下一个/前一个)我希望看到列表中的下一个项目...

LINQ不适合这项工作。 LINQ旨在对集合进行操作,并允许您快速筛选和选择特定元素,并返回单独的集合。它不是设计为“查看”特定对象,然后让您继续前进。它比这更强大,但有更好的工具和方法来实现你想要的。

一个想法是简单地存储当前位置并调用方法来返回集合中的下一个元素:

private int currentPosition = 1;

public City SelectNextCity()
{
    currentPosition++;
    return list[currentPosition];
    // in this context `list` would be a class-level field.
}

这是一个非常粗略的例子。如果您要实际执行此操作,则需要添加一些索引检查以确保在调用之前集合中存在currentPosition

答案 3 :(得分:2)

Linq不是想要操纵对象的目的(参见psubsee2003的回答)

但是,如果你想(如果你必须,头上拿着枪):

    public City GetNext(City actual)
    {
        return list.Skip(list.IndexOf(actual) + 1).Take(1).FirstOrDefault();
    }

答案 4 :(得分:2)

@ Xaruth的答案

的扩展方法
public static T NextIf<T>(this IEnumerable<T> source, T current)
{
    var list = source.ToList();
    return list.Skip(list.IndexOf(current) + 1).Take(1).FirstOrDefault();
}