将Group By和Count从Java转换为C#

时间:2015-01-27 11:01:22

标签: c# linq

我偶然发现了一些对于经验丰富的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#的经验,我只是从一开始就尝试正确所以如果这个问题是微不足道或需要,请原谅我澄清。

1 个答案:

答案 0 :(得分:2)

实际上取决于您打算如何使用这些值。在您的情况下,您需要迭代该字典以获得这些结果,以便您可以跳过该附加部分。

在下面的例子中,您可以跳过上一部分(致电词典):

    var group = people.GroupBy(p => p.LastName);

    foreach(var p in group)
    {
        Console.WriteLine(p.Key + " " + p.Count());
    }

将打印:

  

Doe 2

     

Puma 1

DotNetFiddle

上进行测试

Key始终是您在GroupBy中选择的媒体资源,并且通过在group变量中进行迭代,可以获得已分组的人员。就我而言,我只是Count()和你一样。