linq magic,删除所有rec在哪里

时间:2014-05-29 20:51:56

标签: c# .net

用户拥有UserClaims列表。

我发送用户claimType和claimValue作为参数。基于那些参数,我想删除所有用户声明(如果有的话)。

用户有索赔清单,每个索赔都有自己的用户,类型和价值。

public void RemoveClaim(User user, string type, string value)
{
    var claimsRepository = repository.FindAll().ToList();
}

我想再次删除所有用户声明,其类型和值在方法中作为参数发送。

2 个答案:

答案 0 :(得分:2)

这仅在“存储库”为List时才有效,IEnumerable是不够的,因为它没有添加/删除功能。

如果您符合这些条件,则只需RemoveAll

repositiory.RemoveAll(c => c.Type == type && c.Value == value);

否则,请将WhereRemove一起使用(同样需要支持Remove功能):

foreach (UserClaim c in repositiory.Where(c => c.Type == type && c.Value == value).ToList())
    repository.Remove(c);

答案 1 :(得分:1)

首先,您需要一个实现删除方法的集合,例如List。源集合必须以这种方式工作,只需使用source.ToList()。删除(...)只会从.ToList()生成的副本中删除

其次,你需要警惕在迭代时从集合中删除,因为这会导致抛出异常,并且在从集合中过滤数据时是一个非常常见的问题。避免这种情况的最好方法是对要删除的值集合调用.ToList()或.ToArray(),因为这会将它们呈现为一个集合。

foreach(var itemToRemove in repository
    .Where(conditionMethod)    // You can lambda here or call a method
    .ToArray())    // Necessary to avoid mentioned exception
{ repository.Remove(itemToRemove); }