使用 LINQ 加入列表中的组

Joining groups in a List using LINQ

我有一个 List<Person>,其中 Person 包含多个数据,包括一个 GroupID 和一个 PersonID。这个列表可以包含几千条半敏感数据记录(不是很敏感,但我仍然需要让列表的接收者无法识别单个个体)。我需要将所有包含少于 4 人的组,并在新的 GroupID 下将它们连接在一起,然后 return 一个新的列表。

我已经尝试了几个 linq 查询来让它工作,但我真的被卡住了。我猜我需要做某种 GroupBy,但我不知道在哪里分组以及如何 return 数据。 (仍然需要 List<Person>

即使问题很难理解,我也会试一试。您是否正在寻找一种将 List<Person> 分组到 IEnumerable<List<Person>> 的方法,其中结果序列包含除单个列表中的小组之外的所有组列表?然后试试这个:

List<Person> smallFlattened = groups.Where(x => x.Count() <= 4)
    .SelectMany(p => p).ToList();
IEnumerable<List<Person>> groupPersonLists = groups
    .Where(g => g.Count() > 4)
    .Select(g => g.ToList())
    .Concat(new[] { smallFlattened });

这应该可以解决问题:

int newGroupID = 9; //random number, use your own logic obviously
var grouped = list.GroupBy(a => a.GroupID);
List<Person> newGroupList = grouped.Where(x => x.Count() < 4).SelectMany(p => p).ToList();
newGroupList.ForEach(p => p.GroupID = newGroupID);
//Now the original "list" will reflect the updated data

第一行就是新的组号,显然你应该根据一个"free"整数来选择。 然后根据GroupID进行分组,并选择属于少于4人的组的所有Person个对象。

最后,我们遍历这些人并为他们分配新的 GroupID。 由于 Person 是 class 并且因此是引用类型,因此您将在原始列表中获得更新后的数据。

Dot Net Fiddle 中的工作示例。