根据列表中存在的键值对筛选字典

3
我有一个像这样的字典D1。

enter image description here

和一个像这样的列表L1

enter image description here

我希望有一个像这样的字典(过滤掉那些键在列表中出现的键值对)。

enter image description here

所以,我尝试使用D1.Where(x => L1.Contains(x.Key)),但我得到了一个字典,其中keyvalue中都是空字符串的2行。

请给建议。


调用 Where 方法并不会返回一个字典,而只是一系列的键值对。请提供一个 [mcve],以便我们准确地了解您正在做什么。 - Jon Skeet
另外,你是如何查看结果的?由于 Linq 使用迭代器而不是具体结构,因此很难在调试器中分析 Linq 的结果。 - D Stanley
@DStanley:我正在检查步骤执行后的变量值。 - NutsAndBolts
@JonSkeet:就是这样,我只有这个:“D1.Where(x => L1.Contains(x.Key))”。 - NutsAndBolts
这并不返回一个字典。它返回一个“IEnumerable<KeyValuePair<TKey, TValue>>”。再次提醒,如果您能够提供一个[minimal, complete, verifiable example (MCVE)],我们可以更轻松地帮助您。 - Jon Skeet
2个回答

2
您可以使用类似以下的内容:

您可以使用类似以下的内容:

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 => x.Key, x => x.Value),这样的结果将会是另一个 Dictionary<string, int> 而不是一个 List<KeyValuePair<string, int>> - juharr
好的,我会添加这个注释。 - Amirhossein Yari

1

我可以帮助你翻译,这段内容与编程有关。你需要在不改变 D1 的情况下,确保 L1 中包含 D1 的所有键。有多种方法可以实现这一目标。

如果 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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接