按财产价值分组并撰写小组成员

时间:2012-11-20 03:27:05

标签: c# .net linq group-by linq-to-objects

我需要按部门值对以下列表进行分组,但是LINQ语法有问题。这是我的对象列表:

 var people = new List<Person>
 { 
    new Person { name = "John", department = new List<fields> {new fields { name = "department", value = "IT"}}}, 
    new Person { name = "Sally", department = new List<fields> {new fields { name = "department", value = "IT"}}},
    new Person { name = "Bob", department = new List<fields> {new fields { name = "department", value = "Finance"}}},
    new Person { name = "Wanda", department = new List<fields> {new fields { name = "department", value = "Finance"}}},
 };

我玩弄了分组。就我而言:

var query = from p in people
            from field in p.department
            where field.name == "department"
            group p by field.value into departments
            select new
            {
                Department = departments.Key,
                Name = departments
            };

因此可以遍历组,但不确定如何列出人名 -

foreach (var department in query)
{
    Console.WriteLine("Department: {0}", department.Department);
    foreach (var foo in department.Department)
    {
        // ??
    }
}

有关如何做得更好或如何列出相关部门名称的任何想法?

3 个答案:

答案 0 :(得分:0)

可以通过department.Name访问每个部门的人员列表。只需迭代它:

    foreach( var person in department.Name ) Console.WriteLine( person.name );

另一方面,department.Department的值为string类型。此值来自departments.Key,而后者来自field.value - 因为这是您分组的关键字。

department.Department上的foreach语句仍然编译正常,因为string实现了IEnumerable<char>。因此,您的foo变量的类型为char

答案 1 :(得分:0)

您的department属性似乎是一个尴尬的实现,特别是如果您想按部门分组。使用List作为关键字进行分组将导致大量复杂性,因为您只关心List中的一个元素,所以这是不必要的。

此外,您似乎创建了fields类作为模拟动态/匿名类型的方法,或者只是Dictionary<string, string>类,我无法真正说明。我建议不这样做; C#已经有了这些类型,并且解决它们只会效率低下并阻止你使用Intellisense。无论是什么导致你做到这一点,可能有更好的,更多的C#-ish方式。除此之外 - 这是关键 - 你的代码看起来就像忘记了所有这些并使department成为一个简单的字符串。

如果您可以控制数据结构,我建议重新组织它:

var people = new List<Person> { 
    new Person { name = "John", department = "IT"}, 
    new Person { name = "Sally", department = "IT"},
    new Person { name = "Bob", department = "Finance"},
    new Person { name = "Wanda", department = "Finance"},
};

突然间,将所有这些变得简单:

var departments = from p in people
                  group p by p.department into dept
                  select dept;

foreach (var dept in departments)
{
    Console.WriteLine("Department: {0}", dept.Key);
    foreach (var person in dept)
    {
        Console.WriteLine("Person: {0}", person.name);
    }
}

如果您必须保持数据结构不变,您可以尝试这样做:

from p in people
from field in p.department
where field.name equals "department"
group p by field.value into dept
select dept;

这应该适用于上面的嵌套循环。

答案 2 :(得分:0)

啊,应该是:

foreach (Person p in department.Name) Console.WriteLine(p.name);

感谢额外的一双眼睛,Fyodor!

相关问题