我偶然发现了一些对于经验丰富的C#程序员来说肯定是新手问题(我来自Java背景)。想象一下以下Java POJO:
public class Person {
private final String firstName;
private final String lastName;
Person(final String firstName, final String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
如果我有一个List<Person>
并希望分组的姓氏,然后计算每个姓氏的值数,我会在Java中做这样的事情:
final List<Person> people = Arrays.asList(
new Person("John", "Doe"),
new Person("Jim", "Doe"),
new Person("Johnny", "Puma"));
final Map<String, Long> map =
people.stream().collect(
Collectors.groupingBy(
Person::getLastName,
Collectors.counting()));
然后地图将包含:
{Doe = 2,Puma = 1}
我如何在C#中进行分组?到目前为止我尝试的是:
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
然后分组:
IEnumerable<Person> people = new Person[]
{
new Person {FirstName = "John", LastName = "Doe"},
new Person {FirstName = "Jim", LastName = "Doe"},
new Person {FirstName = "Johnny", LastName = "Puma"}
};
// This is what could surely be improved
var map = people.GroupBy(p => p.LastName)
.ToDictionary(g => g.Key, g => g.Count());
这与Java案例的工作方式相同。但是,这是 C#-way 做事还是有其他首选解决方案/风格?
来自Java生态系统我以前没有使用C#的经验,我只是从一开始就尝试正确所以如果这个问题是微不足道或需要,请原谅我澄清。
答案 0 :(得分:2)
实际上取决于您打算如何使用这些值。在您的情况下,您需要迭代该字典以获得这些结果,以便您可以跳过该附加部分。
在下面的例子中,您可以跳过上一部分(致电词典):
var group = people.GroupBy(p => p.LastName);
foreach(var p in group)
{
Console.WriteLine(p.Key + " " + p.Count());
}
将打印:
上进行测试Doe 2
Puma 1
Key
始终是您在GroupBy
中选择的媒体资源,并且通过在group
变量中进行迭代,可以获得已分组的人员。就我而言,我只是Count()
和你一样。