【问题标题】:Deleting elements from dictionary从字典中删除元素
【发布时间】:2012-12-13 19:43:24
【问题描述】:

是否存在任何简单的解决方案,可以让我使用 LINQ 解决下一个问题。

例如我有 Dictionary 路径;

其中包含以下元素

   <"/abc/12", 13>

   <"/test/abc", 22>

   <"/stack/overflow/com", 43>

   <"/stack/exception", 4>

我有一个 List 过滤器,其中包含以下元素

   "/abc"
   "/stack/overflow"

并且我需要从路径字典中删除那些键不是从过滤器列表中提供的任何字符串开始的元素。所以我应该得到以下结果:

   <"/abc/12", 13>

   <"/stack/overflow/com", 43>

【问题讨论】:

  • 答案可能是肯定的,但如果你展示你已经拥有的“不那么简单”的解决方案,我会更好。

标签: c# linq


【解决方案1】:

你可以使用 Linq:

var toDelete = paths
    .Where(kv => !filter.Any(f => kv.Key.StartsWith(f)));
foreach(var delete in toDelete.Reverse())
    paths.Remove(delete.Key);

Demo

【讨论】:

  • 你需要一个ToList()或类似的东西在第一条语句。
  • 不要忘记 LINQ 是延迟的,所以当你从路径中删除时,foreach 会抛出异常,因为枚举器会很困惑。
  • toDeletes.Reverse() 解决了修改集合的问题。
  • @TimSchmelter 这正是我正在寻找的。谢谢
  • @SPFiredrake:值得注意的是,但是,如果Dictionary 很大并且您只想删除一些键值对,那么使用Remove 可能更有效。
【解决方案2】:

对于非linq方式

创建要删除的新列表

通过paths.keys foreach

在该循环中通过过滤器进行 foreach

if key.contains(filter) ---- 可能要同时添加 toupper() 或 tolower()
然后将 key 添加到 toRemove

然后 foreach 结束 toRemove 调用paths.remove(toRemoveStr);

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 2011-08-16
    • 1970-01-01
    • 2016-05-06
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多