我已经有了这段代码来使用LINQ命名空间获取下一个值。
public static class Extension
{
public static T Next<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
bool flag = false;
using (var enumerator = source.GetEnumerator())
{
while (enumerator.MoveNext())
{
if (flag) return enumerator.Current;
if(predicate(enumerator.Current))
{
flag = true;
}
}
}
return default(T);
}
}
但是现在,我还需要获得之前的价值,但我在这里我不知道该怎么做。
答案 0 :(得分:2)
public static T Previous<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
T t = default(T);
using (var enumerator = source.GetEnumerator())
{
while (enumerator.MoveNext())
{
if(predicate(enumerator.Current))
{
return t;
}
t = enumerator.Current;
}
}
return default(T);
}
答案 1 :(得分:2)
我可能在这里遗漏了一些内容,但直接访问IEnumerable<T>.GetEnumerator()
,IEnumerator<T>.MoveNext()
和IEnumerator<T>.Current
背后的原因是什么?好像你正在直接复制foreach
循环所做的那样。
public static T Next<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
bool shouldReturn = false;
foreach (var item in source)
{
if(shouldReturn)
return item;
if (predicate(item))
shouldReturn = true;
}
return default(T);
}
public static T Previous<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
var previous = default(T);
foreach (var item in source)
{
if (predicate(item))
return previous;
previous = item;
}
return default(T);
}
答案 2 :(得分:1)
如果您只需要前一个值,为什么不在迭代整个集合时挂起每个“previous”。如果您需要更复杂的迭代器,请查看this SO post。