C# 根据列表中的键值筛选字典

C# 根据列表中的键值筛选字典,c#,linq,dictionary,C#,Linq,Dictionary,我有一本这样的字典 还有像这样的列表 我想要一个这样的字典(过滤那些键在列表中的键值对) 因此,我尝试了D1.Where(x=>L1.Contains(x.Key))但是我得到了一个包含两行的字典,其中Key和value中有empriy字符串 请提供建议。您可以使用以下内容: Dictionary<string, int> dictionary = new Dictionary<string, int> {{"A", 1}, {"B", 2}, {"C", 3}};

我有一本这样的字典

还有像这样的列表

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

因此,我尝试了
D1.Where(x=>L1.Contains(x.Key))
但是我得到了一个包含两行的字典,其中
Key
value
中有empriy字符串


请提供建议。

您可以使用以下内容:

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();

有多种方法可以实现您的需求

如果D1的所有键都存在于L1中,而不发生D1突变

Dictionary<string, string> D2 = new Dictionary<string, string>();
L1.ForEach(x => D2[x] = D1[x]);
安全选项:

var D2 = D1.Keys.Intersect(L1).ToDictionary(key => key, key => D1[key]);
更重要的是,这取决于你的创造力

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

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

通过调用
Where
,您将无法获得词典。它只是一系列键/值对。请提供一个列表,以便我们可以确切地看到您正在做什么。另外,您如何查看结果?Linq结果很难在调试器中分析,因为它们使用迭代器,而不是具体的结构。@DStanley:我在执行步骤后检查变量值。@Jonsket:这就是我的全部“D1.Where(x=>L1.Contains(x.Key)),它不会返回字典。它返回一个
IEnumerable
。同样,如果你能提供一个字典,我们可以帮助你更容易。你可以做
ToDictionary(x=>x.Key,x=>x.Value)
,因此结果是另一个
Dictionary
而不是
列表
漂亮的注释。我会添加它
var D2 = D1.Keys.Intersect(L1).ToDictionary(key => key, key => D1[key]);
D1.Where(x => L1.Contains(x.Key))