从Grouping Linq Query生成字符串

时间:2009-01-06 00:03:49

标签: c# linq string

给出以下代码:

var people = new List<person>(){ new person { Name = "John", FamilyName = "Pendray" },
             new person { FamilyName = "Emery", Name = "Jake"},
             new person { FamilyName = "Pendray", Name = "Richard" } };

var q = from p in people
                 orderby p.Name
                 group p by p.FamilyName into fam
                 orderby fam.Key
                 select new { fam.Key, members = from p in fam select p };

是否可以使用将输出IEnumerable <string&gt;的选择替换最后一行?包含这两个字符串: “Pendray John Richard” “Emery Jake”?是否可以将linq查询投影到这样的字符串中?

编辑:我知道这可以通过更多代码实现,但我感兴趣的是,这是否可以在linq查询本身内完成,类似于VB能够从查询中调出xml,如{{3 (特别是本页的最后一个代码块)

2 个答案:

答案 0 :(得分:4)

var q = from p in people
        orderby p.Name
        group p by p.FamilyName into fam
        orderby fam.Key
        select fam.Key + " " + string.Join(" ", (from fm in fam select fm.Name).ToArray());

返回

Emery Jake
Pendray John Richard

答案 1 :(得分:0)

当然。

您必须更改选择部分。最简单的方法是定义一个函数,该函数将获取IEnumerable并生成该字符串,然后调用该函数

people = new List<person>(){ new person { Name = "John", FamilyName = "Pendray" },
         new person { FamilyName = "Emery", Name = "Jake"},
         new person { FamilyName = "Pendray", Name = "Richard" } };

var q = from p in people
        orderby p.Name
        group p by p.FamilyName into fam
        orderby fam.Key
        select new { Key = fam.Key, Text = GetText(fam) };



// and elsewhere...
private string GetText(IEnumerable<person> family) {
    string result = "Whatever"; // build the result string here
    return result;
}

此外,如果您只想要文本,则可以将查询的最后一行更改为

        select GetText(fam);