首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何按内部列表对项目进行分组

如何按内部列表对项目进行分组
EN

Stack Overflow用户
提问于 2018-09-14 09:29:32
回答 2查看 172关注 0票数 2

我想将User的列表按他们的Group分类。

用户可以在多个组中。

代码语言:javascript
运行
复制
public class User
{
    public string Username { get; set; }
    public List<Group> Groups { get; set; }
}

BusinessLogic返回给我一个List<User>

而不是用户有他们的组,我需要修改这个列表,以便组包含用户。

示例:

集团1

  • 用户1
  • 用户2 集团2
  • 用户1
  • 用户3 集团3
  • 用户2
  • 用户3

我被困在需要使用的扩展方法上,所以我不知道该搜索什么。

我假设是GroupBy方法,但在那之后我就迷路了:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-14 09:39:33

使用SelectMany来扁平嵌套集合是检索用户及其组的元组。这样,包含多个组的使用将产生多个记录。下一组按组记录,并将用户保留为组中的项。

代码语言:javascript
运行
复制
var result = userList.SelectMany(user => user.Groups.Select(group => (user,group)))
                     .GroupBy(item => item.group, item => item.User);

在当前实现中,当组by在Group对象上执行时,该对象应该实现EqualsGetHashCode。如果您不想这样做,那么就会存在一个重载,它也会接收一个IEqualityComparer。有关更多细节,请参见文档

注意命名元组的用法。如果在7.0之前使用的是C#,那么可以用匿名对象代替或显式初始化元组,然后还可以更改访问属性的方式-- Item1Item2__。

票数 3
EN

Stack Overflow用户

发布于 2018-09-14 10:18:28

在接受的答案中提出的解决方案不起作用。我的解决方案:

代码语言:javascript
运行
复制
var result1 = from user in users
              from grp in user.Groups
              group user by grp into pivot
              select pivot;

吉拉德代码的修正版本:

代码语言:javascript
运行
复制
var result = users.SelectMany(user => user.Groups,(user, group)=>(user,group))
                          .GroupBy(item => item.group,item=>item.user);

我和吉拉德的完整代码:

代码语言:javascript
运行
复制
static void Main(string[] args)
{
    Group group1 = new Group("Group1");
    Group group2 = new Group("Group2");
    Group group3 = new Group("Group3");
    List<User> users = new List<User>(new User[] {
        new User() { Username = "User1", Groups = new List<Group>(new Group[] { group1,group2})  },
        new User() { Username = "User2", Groups = new List<Group>(new Group[] { group1,group3})  },
        new User() { Username = "User3", Groups = new List<Group>(new Group[] { group2,group3})  }
    });
    var result1 = from user in users
                 from grp in user.Groups
                 group user by grp into pivot
                 select pivot;
    foreach (var r in result1)
    {
        Console.WriteLine(r.Key.Name);
        foreach (var u in r)
            Console.WriteLine(u.Username);
    }

    Console.WriteLine();
    var result = users.SelectMany(user => user.Groups.Select(group => (user, group))
              .GroupBy(item => item.group,item=>item.user));
    foreach (var r in result)
    {
        Console.WriteLine(r.Key.Name);
        foreach (var u in r)
            Console.WriteLine(u.Username);
    }


    Console.ReadKey();
}

public class Group : IEquatable<Group>
{
    public Group(string name)
    {
        Name = name;
    }
    public string Name { get; set; }

    public bool Equals(Group other)
    {
        return other.Name == Name;
    }

    public override bool Equals(object obj)
    {
        return ((Group)obj).Name==Name;
    }

    public override int GetHashCode()
    {
        return Name.GetHashCode();
    }
}
public class User
{
    public string Username { get; set; }
    public List<Group> Groups { get; set; }
}

输出(第一个是我的代码,第二个是Gilad的代码输出):

代码语言:javascript
运行
复制
Group1
User1
User2
Group2
User1
User3
Group3
User2
User3

Group1
User1
Group2
User1
Group1
User2
Group3
User2
Group2
User3
Group3
User3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52328982

复制
相关文章

相似问题

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