C# 按属性值分组并写入组成员

C# 按属性值分组并写入组成员,c#,.net,linq,group-by,linq-to-objects,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

我需要按部门值对以下列表进行分组,但我在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"}}},
 };
因此可以迭代组,但不确定如何列出人名-

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

关于如何做得更好或如何列出相关部门的名称,您有什么想法吗?

每个部门的人员名单可以通过
department.Name
访问。只需对其进行迭代:

    foreach( var person in department.Name ) Console.WriteLine( person.name );
另一方面,
department.department
的值的类型为
string
。此值来自
部门.Key
,而部门.Key又来自
字段.value
——因为这是分组依据的键


department.department
上的foreach语句仍然可以很好地编译,因为
string
实现了
IEnumerable
。因此,您的
foo
变量的类型为
char

您的
department
属性似乎是一个笨拙的实现,特别是如果您想按部门分组。将列表作为键进行分组将导致大量的复杂性,这是不必要的,因为您只关心列表中的一个元素

另外,您似乎已经创建了
字段
类来模拟动态/匿名类型,或者仅仅是
字典
类,我真的不知道。我建议不要这样做;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"},
};
如果必须保持数据结构不变,可以尝试以下方法: 这应该适用于上述嵌套循环。

啊,应该是:

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

谢谢你的眼睛,费奥多

假设您指的是Console.WriteLine(person.Name),它会生成错误:LinqTest.person不包含“Name”的定义,并且没有接受“LinqTest”类型的第一个参数的扩展方法“Name”。Person@WillS:哦,来吧,伙计!你不能处理打字错误吗?这是
name
加上一个小“n”。p人也帮了忙……我错过了回答stackoverflow问题的人的敏感度;)谢谢你,贾斯汀。这是我遇到的一个更复杂问题的一个非常简单的例子。Department位于字段名数组中,但我需要根据特定字段的特定已知值进行分组。我也这么怀疑。那么,最后一个建议应该对你有用。
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;
foreach (Person p in department.Name) Console.WriteLine(p.name);