c# - 如何使用 LINQ to "prune"字典?

标签 c# linq

我有一个字典和一个要从字典中删除的键列表。这是我现在的实现:

var keys = (from entry in etimes
            where Convert.ToInt64(entry.Value) < Convert.ToInt64(stime)
            select entry.Key).ToList();

foreach (var key in keys)
{
    etimes.Remove(key);
    count--;
}

有什么办法可以消除 foreach 循环吗?

最佳答案

var pruned = etimes.Where(entry => Convert.ToInt64(entry.Value) >= 
    Convert.ToInt64(stime)).ToDictionary(entry => entry.Key, 
        entry => entry.Value);

此语句仅使用 LINQ Where 过滤字典函数来选择要保留而不是要删除的项目(如您所示,这需要更多代码)。 ToDictionary转换 IEnumerable<KeyValuePair<TKey, TValue>>为了愿望Dictionary<TKey, TValue>类型,并且至少非常简单,如果不是非常优雅或高效,因为需要指定两个 lambda 表达式来从 KeyValuePair 中选择键和值。 (然后创建一个新字典)。话虽如此,我真的不认为这是一个问题,尤其是当字典很小和/或要删除的项目数量很大时。

关于c# - 如何使用 LINQ to "prune"字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/830709/

相关文章:

c# - 在方法开始和结束时进行错误处理的优缺点是什么

C# - 使用 LINQ 将两个变量放入二维数组中?

c# - EF Core 加载实体未映射到查询

c# - 将参数传递给 WCF 服务构造函数

c# - 如何使用 Entity Framework 将多个表的数据绑定(bind)到 datagridview 并使用 CRUD 操作?

C# LINQ - 过滤查询

c# - 为什么 IEnumerable<T>.Max 不将 T 约束为 IComparable?

c# - Parallel.Foreach 给出错误 "Index was outside the bounds of the array "

c# - 异步等待未在预期线程上执行

c# - 如何向 NET Core 2.0 的 SignalR alpha 上的所有客户端发送消息