读取IEnumerable或等待它先完成更改

本文关键字:IEnumerable 等待 读取 | 更新日期: 2023-09-27 18:01:27

我想在c#中读取字典,并可能使用linq从中获取列表或字典。我的问题是,列表可以在任何时候改变,当我提出请求(即不是线程安全的我猜)。

谁能给我举个例子,我该怎么做?我需要使用lock()吗?

public Dictionary<DateTime, decimal> GetLatest(DateTime since, Dictionary<DateTime, decimal> requestedDict)
{
    Dictionary<DateTime, decimal> returnList = new Dictionary<DateTime, decimal>();
    returnList = requestedDict.Where(x => x.Key > since).ToDictionary(x => x.Key, x => x.Value);
    return returnList;
}

这是我得到的例外:

附加信息:Collection was modified;枚举操作可能不会执行。由于

读取IEnumerable或等待它先完成更改

使用并发字典。锁定是为您实现的。并且它是线程安全的。

你也可以在IDictionary上实现这个扩展方法然后你可以传入任何你想要并发的字典或其他

public static class Extensions
{
    public static IDictionary<DateTime, T> GetLatest<T>(this IDictionary<DateTime, T> dict, DateTime since)
    {
        var returnList = new Dictionary<DateTime, T>();
        returnList = dict.Where(x => x.Key > since).ToDictionary(x => x.Key, x => x.Value);
        return returnList;
    }
}

你可以这样使用:

dict.GetLatest(new DateTime(2014, 1, 1));