我有一个目标列表。对象包含另一个列表。我想要在C#中根据内部列表执行组。
我正在使用下面的代码,但它不起作用。
class Abc
{
public int id { get; set; }
public List<xyz> courselist { get; set; }
}
class xyz
{
public string course { get; set; }
}public void PerformGroupBy
{
List<Abc> projects = new List<Abc>();
var prj1 = new Abc();
prj1.id = 100;
prj1.courselist = new List<xyz>();
prj1.courselist.Add(new xyz { course = "imr101" });
prj1.courselist.Add(new xyz { course = "imr102" });
projects.Add(prj1);
var prj2 = new Abc();
prj2.id = 101;
prj2.courselist = new List<xyz>();
prj2.courselist.Add(new xyz { course = "imr201" });
prj2.courselist.Add(new xyz { course = "imr102" });
projects.Add(prj2);
var prj3 = new Abc();
prj3.id = 103;
prj3.courselist = new List<xyz>();
prj3.courselist.Add(new xyz { course = "imr101" });
prj3.courselist.Add(new xyz { course = "imr102" });
projects.Add(prj3);
var grp1= projects.GroupBy(x => x.courselist).ToList();
// var grp2 = grp1;
}预期结果
[
{
courselist: [{course:imr101},{course:imr102}]
ids: [101,103]
},
{
courselist: [{course:imr201},{course:imr102}]
ids: [102]
}
]发布于 2021-09-14 20:52:28
它没有像预期的那样工作,因为在您的情况下,您需要向您的IEqualityComparer方法提供一个GroupBy。
下面是我为您的案例编写的一篇文章(课程中的订单列表将被忽略,如果这很重要,只需删除OrderBy子句):
internal class XyzListEqualityComparer : IEqualityComparer<List<xyz>>
{
public bool Equals(List<xyz> x, List<xyz> y)
{
var xCourses = x
.Select(subX => subX.course)
.OrderBy(course => course);
var yCourses = y
.Select(subY => subY.course)
.OrderBy(course => course);
return xCourses.SequenceEqual(yCourses);
}
public int GetHashCode(List<xyz> obj)
{
int prime = 31;
int result = 1;
foreach(var item in obj.Select(course => course.course).OrderBy(course => course))
{
result = result * prime + item.GetHashCode();
}
return result;
}
}然后,您只需要编写这个来使用IEqualityComparer进行分组:
var grp1 = projects.GroupBy(x => x.courselist, x => x, new XyzListEqualityComparer()).ToList();如果您不想使用IEqualityComparer,这里有一个算法可以完成这个任务,并给出您想要的确切输出(对于订单来说,性能不是最好的和相同的东西)。
var groupedItems = projects
.GroupBy(project => string.Join(",", project.courselist.Select(course => course.course).OrderBy(course => course)))
.Select(groupedProject => new { courseList = groupedProject.First().courselist, ids = groupedProject.Select(project => project.id) });发布于 2021-09-14 20:48:47
要按集合进行分组,必须为GroupBy函数指定适当的GroupBy函数。无论如何,即使没有这个,您也可以生成分组键:
var grp1 = projects.GroupBy(x => string.Join(",", x.courselist.Select(x => x.course))
.Select(g => new
{
courselist = g.First().courselist,
ids = g.Select(x => x.Id).ToArray()
})
.ToList();https://stackoverflow.com/questions/69182886
复制相似问题