我有一个对象
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 = 1的所有行一样被删除,所有其他行都被包含在内。
我试过这样的事情而且我被困住了。我不知道如何使用它。
userList.GroupBy(c => c.UserID).Select(g => g.UserName )
非常感谢任何帮助。
由于
答案 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();