【问题标题】:Linq query to Check and get dictionary item from list of dictionary itemsLinq 查询以检查并从字典项列表中获取字典项
【发布时间】:2015-12-09 12:27:35
【问题描述】:

我有一个字典项目列表,

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;

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

【问题讨论】:

  • 使用 .FirstOrDefault 或 .ToList 来执行查询。像这样。 lstOfDict.Where(x =&gt; x.ContainsKey("mail")).ToList()
  • SelectMany() 可能就是你要找的东西。
  • “没有结果”是什么意思?有错误吗? mail 是否为空?是空枚举吗?
  • 你做对了,只需要添加 ToList() 扩展

标签: c# linq dictionary


【解决方案1】:

您可以使用任何方法来执行此操作,如下所示:

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 需要提取匹配的键/值对。
  • @AmitKumarGhosh 是的,你说得对,我修复了我的代码,谢谢!!
  • 我提出了完全相同的解决方案。
  • @AmitKumarGhosh 是的,我们的解决方案之间的区别在于您使用了 ToList,而我没有,我更喜欢惰性评估而不是渴望。
【解决方案2】:

您发布的代码应该意味着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"]);
}

【讨论】:

    【解决方案3】:
    try this -
    
    var o = lstOfDict.SelectMany(k => k).Where(key => key.Key == "mail").ToList();
    

    基本上这里的动机是,将Dictionary&lt;string ,string&gt;List 展平,然后拉出具有key == "mail" 的条目。

    【讨论】:

    • 这个 .SelectMany(k => k) 在这里做什么?
    • @A.T.它做了一个平面地图
    • SelecyManyList&lt;List&lt;T&gt;&gt; 上的操作的预期输出是List&lt;T&gt;
    【解决方案4】:

    试试这个

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

    【讨论】:

      【解决方案5】:

      这是另一种方法。

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

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

      列表中有多个词典。但是每个字典只能有一个带有“邮件”键的项目。所以调用First()应该是正确的。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-27
        • 1970-01-01
        • 1970-01-01
        • 2015-11-08
        相关资源
        最近更新 更多