【问题标题】:How to get Next and Prevous values?如何获得下一个和上一个值?
【发布时间】:2012-02-23 23:05:57
【问题描述】:

我有这段代码可以使用 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);
    }
}

但是现在,我还需要获取之前的值,但是我这里我不知道该怎么做。

【问题讨论】:

    标签: linq ienumerable linq-to-objects ienumerator


    【解决方案1】:

    我可能在这里遗漏了一些东西,但是直接访问IEnumerable&lt;T&gt;.GetEnumerator()IEnumerator&lt;T&gt;.MoveNext()IEnumerator&lt;T&gt;.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】:
      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);
          }
      

      【讨论】:

        【解决方案3】:

        如果您只需要前一个值,为什么不在遍历集合时只保留每个“前一个”值。如果您需要更复杂的迭代器,请查看this SO post

        【讨论】:

          猜你喜欢
          • 2012-10-23
          • 1970-01-01
          • 1970-01-01
          • 2018-02-05
          • 1970-01-01
          • 2021-09-26
          • 2020-05-11
          • 1970-01-01
          • 2018-07-05
          相关资源
          最近更新 更多