【问题标题】:Group by Name Linq + C#按名称分组 Linq + C#
【发布时间】:2017-01-05 19:08:51
【问题描述】:

我是 Linq 的新手,我有以下情况。

class Program
{
    static void Main(string[] args)
    {

        var address = new List<Address>();
        address.Add(new Address { AddressLine = "Address 1", City = "City 1", State = "State 1", UserId = 1 });
        address.Add(new Address { AddressLine = "Address 1 Dup", City = "City 1", State = "State 1", UserId = 1 });
        address.Add(new Address { AddressLine = "Address 2", City = "City 2", State = "State 2", UserId = 2 });
        address.Add(new Address { AddressLine = "Address 2 Dup", City = "City 2", State = "State 2", UserId = 2 });
        address.Add(new Address { AddressLine = "Address 3", City = "City 3", State = "State 3", UserId = 1 });
        address.Add(new Address { AddressLine = "Address 3 Dup", City = "City 3", State = "State 3", UserId = 1 });

        var users = new List<User>();
        users.Add(new User { Id = 1, Name = "User 1", NickName = "user 1", Address = address });
        users.Add(new User { Id = 2, Name = "User 1", NickName = "user 2", Address = address });
        users.Add(new User { Id = 3, Name = "User 2", NickName = "user 3", Address = address });
        users.Add(new User { Id = 4, Name = "User 2", NickName = "user 4", Address = address });
    }
}

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Address> Address { get; set; }
    public string NickName { get; set; }
}

public class Address
{
    public string AddressLine { get; set; }
    public string City { get; set; }
    public string State { get; set; }

    public int UserId { get; set; }
}

我想按用户名对用户类列表进行分组,因此如果上述示例的地址前两个名为 user1 的对象应合并为一个对象。两个对象的地址应合并为一个。

【问题讨论】:

  • 所以它应该为每个用户返回一个地址列表?
  • 您如何看待合并? "Address 1" + "Address 1 Dup" = "Address 1Address 1 Dup",还是取地址线最长的地址?还是“AAdddrreessss 11 Dup”(合并它)

标签: c# linq


【解决方案1】:

如果您只需要连接合并用户的地址列表,那么这个 LINQ 就可以做到:

var mergedUsers =
    from user in users
    group user by user.Name
    into newGroup
    let baseUser = newGroup.First()
    select new User
    {
        Id = baseUser.Id,
        Name = baseUser.Name,
        NickName = baseUser.NickName,
        Address = newGroup.SelectMany(u => u.Address).ToList()
    };

此代码还假设合并用户的其他属性,如 NickNameId 是一致的(即相等)。这些值取自合并列表中的第一个用户。

【讨论】:

    【解决方案2】:

    尝试以下:

                var results = users.GroupBy(x => x.Name).Select(x => new
                {
                    ids = x.Select(y => y.Id).ToList(),
                    nicNames = x.Select(y => y.NickName).ToList(),
                    addresses = x.Select(y => new { addresses = address.Where(z => z.UserId == y.Id) }).SelectMany(a => a.addresses).ToList()
                }).ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多