【问题标题】:Is there any built-in .NET Framework alternative for my extension method? [closed]我的扩展方法是否有任何内置的 .NET Framework 替代方案? [关闭]
【发布时间】:2012-11-07 12:44:12
【问题描述】:

我得到了这个在很多情况下都使用的好方法。

internal static IEnumerable<TResult> RoundTrip<TSource, TResult>
 (this IEnumerable<TSource> e, Func<TSource, TSource, TResult> currentNextAction)
{
    using (IEnumerator<TSource> enumer = e.GetEnumerator())
    {
        if (!enumer.MoveNext())
            yield break;

        bool flag = true;
        TSource first = enumer.Current;

        do
        {
            TSource current = enumer.Current;
            TSource next = (flag = enumer.MoveNext()) ? enumer.Current : first;
            yield return currentNextAction(current, next);
        } while (flag);
    }
}

我查看了MSDN 的一些内置替代方案,但找不到它们。有吗?

还有,我可以在这段代码中改进什么吗?

编辑:不可枚举方法的新代码。

internal static IEnumerable<TResult> RoundTrip<TSource, TResult>
 (this IEnumerable<TSource> e, Func<TSource, TSource, TResult> currentNextAction)
{
    bool flag = false;
    TSource first = default(TSource);
    TSource previous = default(TSource);

    foreach (TSource item in e)
    {
        if (!flag)
        {
            flag = true;
            first = previous = item;
            continue;
        }

        yield return currentNextAction(item, previous);
        previous = item;
    }

    if (flag)
        yield return currentNextAction(previous, first);
    else
        yield break;
}

(我喜欢第一个)

【问题讨论】:

  • 您可能想解释一下它的作用。 RoundTrip() 不是最具描述性的名字...
  • 您有具体问题吗?否则你可能想在codereview.stackexchange.com 上问这个问题。
  • Was 是代码的预期行为,它将迭代 ienumeraqble 并进一步返回第一个元素作为第一个和最后一个元素,然后停止。但是从名字上看,它听起来有点像一个“环形缓冲区”,您希望在枚举结束后重新开始枚举......
  • Codereview 在代码改进方面似乎确实有意义。我要说的一件事是,您很少需要直接使用枚举器,我认为这里没有什么不同。您可以将 current 和 next 保存在 foreach 循环范围之外的变量中,然后不必担心执行 movenext、检查返回值以及所有这些手动操作。
  • @RuneFS:在我看来,它循环遍历运行给定函数的可枚举对象,该函数针对当前值及其后面的值以及最后一个(没有后续值)它使用第一个。

标签: c# .net linq extension-methods ienumerable


【解决方案1】:

没有内置任何东西,但你真的可以简化它:

var lst = e.ToList();

lst.Add(lst[0]);
var result = lst.Take(lst.Count - 1).Select((x, i) => action(x, lst[i + 1]));

【讨论】:

    【解决方案2】:

    你有 Enumerable.Zip

    var result = e.Zip(e.Skip(1).Concat(e.Take(1)), action)
    

    它当然会枚举序列两次(+1 元素),除非你先列出一个列表

    编辑:错过往返

    【讨论】:

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