【问题标题】:Filter dictionary on the basis of key value present in list根据列表中存在的键值过滤字典
【发布时间】:2020-02-19 17:34:03
【问题描述】:

我有一本这样的字典 D1

还有一个像这样的列表L1

我想要一个这样的字典(过滤那些键在列表中的键值对)

所以,我尝试了D1.Where(x => L1.Contains(x.Key)),但我在keyvalue 中得到了一个包含两行空字符串的字典。

请指教。

【问题讨论】:

  • 调用Where 不会得到字典。它只是一系列键/值对。请提供minimal reproducible example,以便我们准确了解您在做什么。
  • 另外,您如何查看结果? Linq 结果很难在调试器中分析,因为它们使用迭代器而不是具体结构。
  • @DStanley:我在执行步骤后检查变量值。
  • @JonSkeet:这就是我所拥有的一切“D1.Where(x => L1.Contains(x.Key))”
  • 这不会返回字典。它返回一个IEnumerable<KeyValuePair<TKey, TValue>>。同样,如果您可以提供minimal reproducible example,我们可以更轻松地为您提供帮助。

标签: c# linq dictionary


【解决方案1】:

你可以使用这样的东西:

Dictionary<string, int> dictionary = new Dictionary<string, int> {{"A", 1}, {"B", 2}, {"C", 3}};

List<string> list = new List<string> {"A","B"};

var result = dictionary.Where(x => list.Contains(x.Key)).ToList();

var result = dictionary.Where(x => list.Contains(x.Key)).ToDictionary(x=>x.Key,x=>x.Value);

【讨论】:

  • 你可以做ToDictionary(x =&gt; x.Key, x =&gt; x.Value) 所以结果是另一个Dictionary&lt;string, int&gt; 而不是List&lt;KeyValuePair&lt;string, int&gt;&gt;
  • 很好的注释。我会添加它
【解决方案2】:

有多种方法可以满足您的需求

如果 D1 的所有键都存在于 L1 中而没有改变 D1

Dictionary<string, string> D2 = new Dictionary<string, string>();
L1.ForEach(x => D2[x] = D1[x]);

var D2 = L1.ToDictionary(el => el, key => D1[key]);

安全选项:

var D2 = D1.Keys.Intersect(L1).ToDictionary(key => key, key => D1[key]);

甚至更多,取决于你的创造力

请注意,这对于大列表和字典来说很慢

D1.Where(x => L1.Contains(x.Key))

【讨论】:

    猜你喜欢
    • 2020-02-06
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2017-04-22
    • 2019-12-27
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多