比较和重组3个列表到一个列表中?

时间:2015-06-03 20:51:21

标签: c# algorithm list

所以我有以下内容:

class Item
{
    string Name;
    bool IsSelected;
}

我有3个名单:

List<Item> list1;
List<Item> list2;
List<Item> list3;

我的目标是将上面的内容翻译成一个集合,其中类似的“Item”对象被组合在一起(类似=具有相同“Name”的对象)。

所以我想:

List<ItemContainer> resultantList;

其中:

class ItemContainer
{
    string Name;
    IList<Item> items;  //items with the same 'Name' (potentially)
}

注意:

  • 列表可以包含不同数量的项目。
  • 'Item'对象只能属于一个列表。只是我们可以在不同的列表中使用相同的“名称”来创建不同的对象。
  • 如果找不到具有相同“名称”的其他对象,则会 仍然需要包括在结果列表中。

实现这一目标最简洁,最清晰的方法是什么?

注意:表现不是问题。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您可以尝试GroupBy

var groupyName = list1.Concat(list2).Concat(list3).GroupBy(I => I.Name);

答案 1 :(得分:1)

这是做到这一点的方法:

itemContainer.items = list1.Concat(list2).Concat(list3)
                    .Distinct()
                    .OrderBy(item => item.Name)
                    .ThenByDescending(item => item.IsSelected)
                    .ToList();

以下是您要求的完整示例,
请注意,您不需要GroupBy,因为分组的返回值与您希望收到的新列表不同。

您需要覆盖ItemGetHashCode()的{​​{1}}方法,因为Equals(object obj)会自动使用它们来比较项目。

Distinct()