相关疑难解决方法(0)

foreach + break vs linq FirstOrDefault性能差异

我有两个类来执行特定日期的日期范围数据获取.

public class IterationLookup<TItem>
{
    private IList<Item> items = null;

    public IterationLookup(IEnumerable<TItem> items, Func<TItem, TKey> keySelector)
    {
        this.items = items.OrderByDescending(keySelector).ToList();
    }

    public TItem GetItem(DateTime day)
    {
        foreach(TItem i in this.items)
        {
           if (i.IsWithinRange(day))
           {
               return i;
           }
        }
        return null;
    }
}


public class LinqLookup<TItem>
{
    private IList<Item> items = null;

    public IterationLookup(IEnumerable<TItem> items, Func<TItem, TKey> keySelector)
    {
        this.items = items.OrderByDescending(keySelector).ToList();
    }

    public TItem GetItem(DateTime day)
    {
        return this.items.FirstOrDefault(i => i.IsWithinRange(day));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我做了速度测试,表明Linq版本慢了大约5倍.当我在本地存储项目而不使用它们进行枚举时,这是有意义的ToList.这会使它慢得多,因为每次调用时 …

c# linq performance foreach .net-4.0

49
推荐指数
3
解决办法
9469
查看次数

闭包如何在幕后工作?(C#)

我觉得我对闭包有很好的理解,如何使用它们,以及它们什么时候有用.但我不明白的是他们实际上是如何在幕后的幕后工作的.一些示例代码:

public Action Counter()
{
    int count = 0;
    Action counter = () =>
    {
        count++;
    };

    return counter;
}
Run Code Online (Sandbox Code Playgroud)

通常,如果闭包没有捕获{count},它的生命周期将被限定为Counter()方法,并且在它完成之后它将消除Counter()的其余堆栈分配.什么时候关闭会发生什么?这个Counter()调用的整个堆栈分配是否存在?它会将{count}复制到堆中吗?它是否从未真正在堆栈上分配,但被编译器识别为关闭,因此总是存在于堆上?

对于这个特殊的问题,我主要关注它在C#中是如何工作的,但是不反对与支持闭包的其他语言进行比较.

.net c# closures

45
推荐指数
2
解决办法
3415
查看次数

标签 统计

c# ×2

.net ×1

.net-4.0 ×1

closures ×1

foreach ×1

linq ×1

performance ×1