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.
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)
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的回答,词典是无序的......但希望无论如何上述内容都会对你有所帮助.
| 归档时间: |
|
| 查看次数: |
7477 次 |
| 最近记录: |