【问题标题】:Replace Linq methods in .NET 2.0替换 .NET 2.0 中的 Linq 方法
【发布时间】:2016-02-15 14:34:02
【问题描述】:

我一直在到处寻找有关如何将 LINQ 中使用的某些方法替换为标准 c# 代码的示例。我有一个非常简单的助手,我需要在 .NET 2.0 环境中使用它。我需要一个替代方案:

Skip()
Take()
using()

方法。我看过this 的帖子,也看过 LINQBridge 解决方案,但想知道是否有任何资源可以解释如何用直接代码替代方法替换这些方法?

【问题讨论】:

  • using()不是linq,是C#语句,翻译成try-finally,剩下的可以看reference code
  • 另请参阅 Jon Skeet 关于重新实现 LINQ to objects 的文章。
  • 请求外部资源的问题是题外话。

标签: c# .net performance linq .net-2.0


【解决方案1】:

你可以自己写TakeSkip

public static IEnumerable<T> Skip<T>(IEnumerable<T> set, int count)
{
    if(set == null) throw ArgumentNullException("set");
    if(count < 0) throw ArgumentOutOfRangeException("count");
    return SkipImp(set, count);
}

private static IEnumerable<T> SkipImp<T>(IEnumerable<T> set, int count)
{
    foreach(var item in set)
    {
        if(count-- <= 0)
        {
            yield return item;
        }
    }
}

public static IEnumerable<T> Take<T>(IEnumerable<T> set, int count)
{
    if(set == null) throw ArgumentNullException("set");
    if(count < 0) throw ArgumentOutOfRangeException("count");
    return TakeImp(set, count);
}

private static IEnumerable<T> TakeImp<T>(IEnumerable<T> set, int count)
{
    foreach(var item in set)
    {
        if(count-- > 0)
        {
            yield return item;
        }
        else
        {
            yield break;
        }
    }
}

你必须这样做

var results = ContainingClass.Take(ContainingClass.Skip(list, 3), 4);

而不是

var results = list.Skip(3).Take(4);

请注意,在每种情况下使用两个单独的方法的原因是,当调用方法而不是迭代 IEnumerable&lt;T&gt; 时会引发异常。

如果您使用支持该功能的编译器(VS 2008 及更高版本),我认为您甚至可以为它们制作扩展方法,因为它是编译器版本而非 .net 版本的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2023-03-24
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2012-08-08
    相关资源
    最近更新 更多