如何从LINQ选择查询初始化字符串列表?

时间:2019-05-29 23:06:06

标签: c# linq

我正在从下面的代码初始化字符串列表:

            var headerValues = new Dictionary<string, List<string>>
            {
                {
                    "section1",
                    new List<string>()
                    {
                        "id",
                        "item"
                    }
                },
                {
                    "section2",
                    new List<string>()
                    {
                        "titile",
                        "content1",
                        "content2"
                    }
                },
                // and the rest of sections
            };
            var results = from s1 in section1Collection
                          from s2 in section2Collection
                          from s3 in section3Collection
                          from s4 in section4Collection
                          select new List<string>
                          {
                              // section1
                              GetValue(s1, headerValues["section1"][0]),
                              GetValue(s1, headerValues["section1"][1]),
                              // section2
                              GetValue(s2, headerValues["section2"][0]),
                              GetValue(s2, headerValues["section2"][1]),
                              GetValue(s2, headerValues["section2"][2]),
                              // and the rest of sections
                          };

但是必须有一种循环执行的方法,对吗?还是可以在函数中初始化结果列表?

如何以更智能,更可靠,更易读的方式生成此结果列表?

顺便说一句,GetValue方法只是从传入的标头值字符串中查找s1,s2等中的值。

编辑:我正在寻找的东西是这样的:

var results = from s1 in section1
              from s2 in section2
              from s3 in section3
              from s4 in section4
              select new List<string>
              {
                  // GetValues should return all section1 strings based on the headerValues["section1"] array
                  GetValues(s1, headerValues["section1"]),
                  // section2
                  GetValues(s2, headerValues["section2"]),
                  // and the rest of sections
               };

1 个答案:

答案 0 :(得分:-1)

如前所述,您正在寻找的是SelectMany。它将嵌套的集合扁平化为一维的集合。这是您应该如何使用它。

var results = headerValues.SelectMany(item => item.Value);

那是什么呢?这里的“ item”是一个KeyValuePair(因为您使用的字典由它们组成),而item.Value是一个列表(因为它是此特定字典值的类型)。现在,给定的列表列表SelectMany将它们加入并作为单个IEnumerable字符串返回