首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在对象列表上执行组

如何在对象列表上执行组
EN

Stack Overflow用户
提问于 2021-09-14 18:26:52
回答 2查看 69关注 0票数 0

我有一个目标列表。对象包含另一个列表。我想要在C#中根据内部列表执行组。

我正在使用下面的代码,但它不起作用。

代码语言:javascript
复制
class Abc
{
    public int id { get; set; }
    public List<xyz> courselist { get; set; }
}

class xyz
{
    public string course { get; set; }
}
代码语言:javascript
复制
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;
}

预期结果

代码语言:javascript
复制
[
    {
        courselist: [{course:imr101},{course:imr102}]
        ids: [101,103]
    },
    {
        courselist: [{course:imr201},{course:imr102}]
        ids: [102]
    }
]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-14 20:52:28

它没有像预期的那样工作,因为在您的情况下,您需要向您的IEqualityComparer方法提供一个GroupBy。

下面是我为您的案例编写的一篇文章(课程中的订单列表将被忽略,如果这很重要,只需删除OrderBy子句):

代码语言:javascript
复制
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进行分组:

代码语言:javascript
复制
var grp1 = projects.GroupBy(x => x.courselist, x => x, new XyzListEqualityComparer()).ToList();

如果您不想使用IEqualityComparer,这里有一个算法可以完成这个任务,并给出您想要的确切输出(对于订单来说,性能不是最好的和相同的东西)。

代码语言:javascript
复制
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) });
票数 1
EN

Stack Overflow用户

发布于 2021-09-14 20:48:47

要按集合进行分组,必须为GroupBy函数指定适当的GroupBy函数。无论如何,即使没有这个,您也可以生成分组键:

代码语言:javascript
复制
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();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69182886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档