如何在列表中使用Linq/C#获取当前和当前之后的项目?

Mar*_*rco 15 c# linq foreach list

我有一个项目列表,如果我选择一个项目,那么我将提供上一个和下一个选项.我添加了一个快速代码示例,但我希望有更好/更快的方法来执行此示例,例如500个项目.

是否有linq选项或其他什么?

我检查了enumarator,但只有一个moveNext en无法设置当前.

快速举例:

项目是一本字典

project是字典中存在的keyvaluepair

var match = false;
var save = new KeyValuePair<ExtendedProjectLightPlan, Page>();
var before = new KeyValuePair<ExtendedProjectLightPlan, Page>();
var after = new KeyValuePair<ExtendedProjectLightPlan, Page>();
foreach (var p in projects)
{
    before = save;
    save = p;

    if (match)
    {
        after = p;
        break;
    }

    if (p.Key.Id == project.Key.Id)
    {
        match = true;
    }                
}
Run Code Online (Sandbox Code Playgroud)

Dam*_*ell 17

' current' 之前的项目:

items.TakeWhile(x => x != current).LastOrDefault();
Run Code Online (Sandbox Code Playgroud)

' current' 之后的项目:

items.SkipWhile(x => x != current).Skip(1).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

适用于整数类型,但将default(T)在序列的末尾返回.将项目转换为Nullable<T>在第一个项目之前和最后一个项目之后返回可能很有用null.

  • 对于列表来说,这是最好的解决方案。 (2认同)

dec*_*one 16

你尝试过使用IndexOf()ElementAt()方法吗?

    Int32 index = list1.IndexOf(item);
    var itemPrev = list1.ElementAt(index - 1);
    var itemNext = list1.ElementAt(index + 1);
Run Code Online (Sandbox Code Playgroud)

  • @Marco:字典前后的意思是什么?您使用的是[`SortedDictionary`](http://msdn.microsoft.com/en-us/library/f7fta44c.aspx)吗? (3认同)
  • 使用此代码,如果项目是第一个元素,即索引0或最后一个元素,您将获得异常。 (2认同)
  • 我假设OP熟悉`IndexOutOfRangeException`! (2认同)

Jon*_*eet 14

LINQ没有内置任何东西,但你可以很容易地编写自己的...这里是一个使用Tuple.NET 4 的实现.它将为一个最初有n个项目的序列返回n-2个项目 - 但你可以调整如果有必要的话.

public IEnumerable<Tuple<T, T, T>> WithNextAndPrevious<T>
    (this IEnumerable<T> source)
{
    // Actually yield "the previous two" as well as the current one - this
    // is easier to implement than "previous and next" but they're equivalent
    using (IEnumerator<T> iterator = source.GetEnumerator())
    {
        if (!iterator.MoveNext())
        {
            yield break;
        }
        T lastButOne = iterator.Current;
        if (!iterator.MoveNext())
        {
            yield break;
        }
        T previous = iterator.Current;
        while (iterator.MoveNext())
        {
            T current = iterator.Current;
            yield return Tuple.Create(lastButOne, previous, current);
            lastButOne = previous;
            previous = current;
        }
    }        
}
Run Code Online (Sandbox Code Playgroud)

请注意,根据LukeH的回答,词典是无序的......但希望无论如何上述内容都会对你有所帮助.


Luk*_*keH 5

字典没有内在的顺序,因此上一个和下一个项目的想法几乎是荒谬的.