| 实体清单|标签类别|
| --|--|
| entity1|(cat1,cat2,cat3)|
| 实体2|(cat2,cat4,cat5)|
| 实体3|(cat1,cat3,cat5)|
| 实体4|(cat2,cat3)|
| 实体5|(cat1,cat4,cat5)|
Class Entity
{
Entity Name;
List<Category> Categories
}
var listentities= somemethod(); //returns List<Entity> <br>
字符串
预期产出:
| - -|- -|
| --|--|
| cat1|实体1、实体3、实体5|
| cat2|实体2,实体4|
| cat3|实体1、实体3、实体4|
注意:我使用2个foreach循环和字典得到了想要的输出,但是我想使用linq。
3条答案
按热度按时间m3eecexj1#
为了直接回答你的问题,你可以使用
SelectMany
和Distinct
来得到你想要的,尽管正如我的评论所说,它可能不会比你已经做的更快:字符串
qybjjes12#
或许:
字符串
这将实体数据扩展为{实体,类别}对,按类别分组,然后构建结果。
如果需要的话,最终的结果可以调整为只包含名称而不是对象引用。此外,如果你想的话,实体名称可以使用
.Aggregate()
或String.Join()
连接到一个字符串中。.GroupBy(ec => ec.Category)
。如果Category不是IEquatable
,则可能需要.GroupBy(ec => ec.Category.Name)
,在这种情况下,后面的Category = g.Key
需要更改为Category = g.First().Category
。*hujrc8aj3#
我将
Entity
类定义为字符串
如果类别是自定义类型,则可能需要将其等同。
我将测试
SomeMethod
方法定义为型
双循环-无Linq
首先,一种不使用Linq的方法。
型
基本上,循环遍历
Entity
对象的列表,并循环遍历Entity
对象中的类别以填充Dictionary。Linq
这一次,使用Linq。
型
GroupBy
的返回值大致相当于字典,可以通过提供resultSelector
来“清理”一下。这两种方法都产生以下输出:
型