如果分组项的值为零,则删除整个组

时间:2017-07-11 13:47:46

标签: c# linq

我有一个对象

public class ActiveUser
{
  public int UserID { get; set; }
  public string UserName { get; set; }
  public string Location { get; set; }
  public bool IsActive{ get; set; }
}

带数据

List<ActiveUser> userList = new List<ActiveUser>();
userList.Add( new User { UserID = 1, UserName = "UserOne", Location = "LOne", IsActive= false } );
userList.Add( new User { UserID = 1, UserName = "UserOne", Location = "LTwo", IsActive= false } );
userList.Add( new User { UserID = 2, UserName = "UserTwo", Location = "LOne", IsActive= true } );
userList.Add( new User { UserID = 2, UserName = "UserTwo", Location = "LTwo", IsActive= false } );
userList.Add( new User { UserID = 2, UserName = "UserTwo", Location = "LThree", IsActive= true } );
userList.Add( new User { UserID = , UserName = "UserThree", Location = "LOne", IsActive= true } );

我想要什么? 我想使用C#。使用LinQ或lambda表达式选择具有以下条件的数据。

  • 如果我们按UserID分组,在该组中,如果所有行的IsActive为false,则无需选择该组。
  • 如果该组至少包含一个IsActive为True,那么我们必须选择该组中的所有行,包括IsActive = false

因此输出应该像UserID = 1的所有行一样被删除,所有其他行都被包含在内。

我试过这样的事情而且我被困住了。我不知道如何使用它。

userList.GroupBy(c => c.UserID).Select(g => g.UserName )

非常感谢任何帮助。

由于

2 个答案:

答案 0 :(得分:3)

如果要更改原始列表,则for循环更合适。如果您想创建仅包含至少一个有效项目的列表,则可以在Where之后添加GroupBy

var query = userList.GroupBy(c => c.UserID)
                    .Where(g => g.Any(c => c.IsActive))

请注意,您无法Select(g => g.UserName),因为GroupBy的输出是群组的集合,并且这些群组不公开其中的物品。如果您想要投影原始项目而不是群组,请使用SelectMany来&#34;展平&#34;小组:

var query = userList.GroupBy(c => c.UserID)
                    .Where(g => g.Any(c => c.IsActive))
                    .SelectMany(g => g)

答案 1 :(得分:2)

您可以使用group.Any(u => u.IsActive)

var allWithAtLeastOneActiveUser = userList
    .GroupBy(c => new { c.UserID, c.UserName })
    .Where(g => g.Any(u => u.IsActive));

如果你想展平这些群体:

List<ActiveUser> allWithAtLeastOneActiveUser  = userList
    .GroupBy(c => new { c.UserID, c.UserName })
    .Where(g => g.Any(u => u.IsActive))
    .SelectMany(g => g)
    .ToList();