我有以下字典
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
实现这一点答案 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()
正在这样做)。它就像一个蓝图,它指定了在执行(迭代)时如何返回信息。
让我们分别检查每个陈述:
from dictionary in m1
- 这与foreach(var dictionary in m
非常相似,只是它没有迭代(因为它是一个蓝图)。它指定我们正在迭代的源(m1
)和要分配给每个成员的变量(dictionary
。我们知道它将是类型Dictionary<String, String>
)from keyValuePair in dictionary
- 这里我们使用从前一个语句创建的dictionary
变量。 keyValuePair
的类型将为KeyValuePair<string,string>
,因为我们将&#34;迭代&#34;执行查询时通过Dictionary<string,string>
。where keyvaluePair.Key == "h1"
- 这会从前一个Key
属性等于&#34; h1&#34;的语句中过滤掉keyValuePairs。 KeyValuePair
,我们可以select
他们的Value
属性。这个&#34;项目&#34;已过滤的KeyValuePair
序列为新类型IEnumerable<string>
ToList
方法执行查询以获得结果。