首页 >后端开发 >C++ >如何使用c#中的linq通过键进行对象?

如何使用c#中的linq通过键进行对象?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-02-02 00:21:10778浏览

How Can I Group Objects by a Key Using LINQ in C#?

使用LINQ按键分组对象

面向对象编程中,根据公共属性或键分组对象非常有用。本例探讨如何使用LINQ(语言集成查询)按PersonID分组对象,并获取与每个人关联的汽车列表。

假设我们有一个名为Person的类:

<code class="language-csharp">class Person
{
    public int PersonID;
    public string Car; // 将car改为Car,符合C#命名规范
}</code>

我们还有一个Person对象的列表:

<code class="language-csharp">List<Person> persons;</code>

此列表可能包含多个具有相同PersonID的实例。例如:

<code class="language-csharp">persons = new List<Person>()
{
    new Person { PersonID = 1, Car = "Ferrari" },
    new Person { PersonID = 1, Car = "BMW" },
    new Person { PersonID = 2, Car = "Audi" }
};</code>

我们的目标是按PersonID分组这些对象,并获取每个人拥有的所有汽车的列表。预期结果如下所示:

<code class="language-csharp">class Result
{
    public int PersonID;
    public List<string> Cars;
}</code>

分组后,我们将得到:

<code class="language-csharp">// 示例结果,实际结果由LINQ查询生成
var results = new List<Result>()
{
    new Result { PersonID = 1, Cars = new List<string> { "Ferrari", "BMW" } },
    new Result { PersonID = 2, Cars = new List<string> { "Audi" } }
};</code>

为此,我们可以利用LINQ的GroupBy方法:

<code class="language-csharp">var results = from p in persons
              group p.Car by p.PersonID into g
              select new Result { PersonID = g.Key, Cars = g.ToList() };</code>

在GroupBy子句中,我们将PersonID指定为分组的键,并投影Car属性。生成的序列将是一组与各自汽车列表关联的键。

或者,可以使用Lookup字典来实现相同的结果:

<code class="language-csharp">var carsByPersonId = persons.ToLookup(p => p.PersonID, p => p.Car);</code>

这将创建一个字典,其中键是PersonID,值是每个人的汽车列表。要检索特定人的汽车,可以使用:

<code class="language-csharp">// 这将返回一个空序列,对于查找中不存在的personId
var carsForPerson = carsByPersonId[personId];</code>

通过使用这些技术,您可以使用C#和LINQ有效地按公共键分组对象,并以简洁高效的方式检索关联数据的列表。 代码示例已改进,更符合C#的编码规范。

以上是如何使用c#中的linq通过键进行对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn