我有一个字典项列表,
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;
但是没有结果,任何解决这个问题的想法都会有所帮助。 感谢
答案 0 :(得分: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 :(得分:3)
try this -
var o = lstOfDict.SelectMany(k => k).Where(key => key.Key == "mail").ToList();
此处的动机基本上是为了展平List
的{{1}},然后拉出具有Dictionary<string ,string>
的条目。
答案 2 :(得分:2)
试试这个
lstOfDict.Where(x => x.ContainsKey("mail")).ToList();
答案 3 :(得分:1)
您可以使用Any方法执行此操作,如下所示:
{{1}}
答案 4 :(得分: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);
以下查询将为我们提供电子邮件地址的IENumerable集合(集合中的集合)。
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.
}