0

我有这门课:

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 在我的列表中移动下一个或上一个?

4

5 回答 5

7

您想要ElementAt,它在逻辑上等同于使用列表索引器属性,并且可能比在运行时使用 Skip & Take 快得多,因为它包含特定检查以查看序列是否实现IList,如果是则使用索引器,如果不是则迭代序列(类似于做 a 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<>

于 2013-05-02T12:53:11.410 回答
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 实际上使解决方案比应有的困难得多。

于 2013-05-02T12:59:46.857 回答
2

像你想要的那样操作对象并不是 Linq 的目的(参见 psubsee2003 的回答)

但是,如果您愿意(如果必须的话,头上顶着枪):

    public City GetNext(City actual)
    {
        return list.Skip(list.IndexOf(actual) + 1).Take(1).FirstOrDefault();
    }
于 2013-05-02T13:00:46.980 回答
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在调用它之前存在于集合中。

于 2013-05-02T12:57:06.377 回答
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();
}
于 2014-10-30T11:31:58.650 回答