Dictionary <string,list <dictionary <string,string =“”>&gt;&gt;使用linq查询

时间:2015-10-10 15:04:36

标签: linq dictionary

我有以下字典

        Dictionary<string,string> q1=new Dictionary<string,string>
        { 
        {"h1","name1"},{"h2","name2"}
        };
        Dictionary<string,string> q2=new Dictionary<string,string>
        { 
        {"h1","name12"},{"h2","name23"}
        };
        Dictionary<string,string> q3=new Dictionary<string,string>
        { 
        {"h1","name123"},{"h2","name234"}
        };
        List<Dictionary<string,string>> m1 = new List<Dictionary<string,string>> { q1,q2,q3 };
        Dictionary<string, List<Dictionary<string,string>>> mhi = new Dictionary<string, List<Dictionary<string,string>>>();
        mhi.Add("x1", m1);

我需要使用linq返回一个名为name1,name12,name123的列表。 我知道正常的方法对我有用。但我很想知道如何使用linq

实现这一点

1 个答案:

答案 0 :(得分:0)

试试这个:

var q1 = new Dictionary<string, string> {
    {"h1", "name1"},
    {"h2", "name2"}
};
var q2 = new Dictionary<string, string> {
    {"h1", "name12"},
    {"h2", "name23"}
};
var q3 = new Dictionary<string, string> {
    {"h1", "name123"},
    {"h2", "name234"}
};
var m1 = new List<Dictionary<string, string>> { q1, q2, q3 };
//Using LINQ
List<string> result = (from dictionary in m1
                       from keyValuePair in dictionary
                       where keyValuePair.Key == "h1" 
                       select keyValuePair.Value).ToList();
//result = name1,name12,name123

//without linq
var result2 = new List<string>();
foreach(var dictionary in m1)
    foreach(var keyValuePair in dictionary)
        if(keyValuePair.Key == "h1")
            result2.Add(keyValuePair.Value);

修改
from子句指定数据源,where子句应用过滤器,select子句将序列的每个元素投影到新表单中。

Linq查询在我们遍历它之前不会执行。 (这里.ToList()正在这样做)。它就像一个蓝图,它指定了在执行(迭代)时如何返回信息。

让我们分别检查每个陈述:

  1. from dictionary in m1 - 这与foreach(var dictionary in m非常相似,只是它没有迭代(因为它是一个蓝图)。它指定我们正在迭代的源(m1)和要分配给每个成员的变量(dictionary。我们知道它将是类型Dictionary<String, String>
  2. from keyValuePair in dictionary - 这里我们使用从前一个语句创建的dictionary变量。 keyValuePair的类型将为KeyValuePair<string,string>,因为我们将&#34;迭代&#34;执行查询时通过Dictionary<string,string>
  3. where keyvaluePair.Key == "h1" - 这会从前一个Key属性等于&#34; h1&#34;的语句中过滤掉keyValuePairs。
  4. 现在我们过滤了KeyValuePair,我们可以select他们的Value属性。这个&#34;项目&#34;已过滤的KeyValuePair序列为新类型IEnumerable<string>
  5. 最后,ToList方法执行查询以获得结果。