我需要按部门值对以下列表进行分组,但是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)
{
// ??
}
}
有关如何做得更好或如何列出相关部门名称的任何想法?
答案 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!