从字典项列表中检查并获取字典项的Linq查询

3

我有一个字典列表,

List<Dictionary<string,string>> lstOfDict = new List<Dictionary<string,string>>();

字典项:

<"name","Adam">
<"mail","abc@abc.com">
<"number",123>

这些字典项在列表lstOfDict中,我需要一个Linq查询来检查列表是否包含键为“mail”的字典项,如果有,获取该字典项。

我已经尝试过:

   var mail = from item in lstOfDict 
               where(x => x.ContainsKey("mail"))
               select item;

但是没有结果,任何解决此问题的想法都会很有帮助。 谢谢。


4
使用 .FirstOrDefault 或 .ToList 执行查询。就像这样:lstOfDict.Where(x => x.ContainsKey("mail")).ToList() - M.kazem Akhgary
可能 SelectMany() 是你正在寻找的。 - Amit Kumar Ghosh
“没有结果”是什么意思?有错误吗?mail是null吗?还是空枚举? - Gary McGill
你做得没错,只需要添加ToList()扩展方法即可。 - A.T.
5个回答

4
你可以使用任何方法来实现这个,例如:

List<Dictionary<string, string>> lstOfDict = new List<Dictionary<string, string>>();            
lstOfDict.Add(new Dictionary<string, string> 
{ 
    ["name"] = "Adam", 
    ["mail"] = "abc@abc.com"
}); 

var containsEmail = lstOfDict.SelectMany(x => x).Where(x => x.Key == "mail");

嗯,我猜OP需要提取匹配的键/值对。 - Amit Kumar Ghosh
1
@AmitKumarGhosh 是的,你说得对,我已经修复了我的代码,谢谢!! - Alberto Monteiro
我提出了完全相同的解决方案。 - Amit Kumar Ghosh
@AmitKumarGhosh 是的,我们解决方案的区别在于你使用了ToList,而我没有,我更喜欢惰性求值而不是急切求值。 - Alberto Monteiro

4

试试这个

 lstOfDict.Where(x => x.ContainsKey("mail")).ToList();

4
try this -

var o = lstOfDict.SelectMany(k => k).Where(key => key.Key == "mail").ToList();

基本上,这里的动机是将 List 中的 Dictionary<string ,string> 压扁,然后提取具有 key == "mail" 的条目。

这里的 .SelectMany(k => k) 是做什么的? - A.T.
1
@A.T. 它执行一个 flatMap。 - Alberto Monteiro
List<List<T>> 上执行 SelectMany 操作的预期输出是 List<T> - Amit Kumar Ghosh

3
您发布的代码应当意味着mail是所有包含键"mail"的字典的枚举。然后您需要决定如何处理它,例如:
var numberOfMatchingDictionaries = mail.Count();

...或者:

var firstMatchingDictionary = mail.FirstOrDefault();
if (firstMatchingDictionary != null)
{
    Console.WriteLine("Value is {0}", firstMatchingDictionary["mail"]);
}

...或者:

foreach(var dictionary in mail)
{
    Console.WriteLine("Value is {0}", dictionary["mail"]);
}

1

这是另一种实现方式。

首先,创建一些模拟数据。

   List<Dictionary<string, string>> lstOfDict = new List<Dictionary<string, string>>();
   var dict1 = new Dictionary<string, string>();
   dict1.Add("name", "Adam");
   var dict2 = new Dictionary<string, string>();
   dict2.Add("mail", "abc@abc.com");
   var dict3 = new Dictionary<string, string>();
   dict3.Add("mail", "xyz@abc.com");
   lstOfDict.Add(dict1);
   lstOfDict.Add(dict2);
   lstOfDict.Add(dict3);

下面的查询将给我们一个电子邮件地址的枚举集合(集合内包含另一个集合)。
   var emails = lstOfDict.Where(d => d.ContainsKey("mail")).Select(d => d.Values).ToList();

您的列表中有多个字典。但是每个字典只能有一个带有键“mail”的项目。因此调用 First() 应该是正确的。

   foreach (var email in emails)
    {
       Console.WriteLine(email.First());// here we are printing the email addresses.
    }

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