使用 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 中的工作示例。
我有一个 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 中的工作示例。