面向对象编程中,根据公共属性或键分组对象非常有用。本例探讨如何使用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中文网其他相关文章!