¿Cuál es la mejor manera de abordar la eliminación de elementos de una colección en C #, una vez que el elemento es conocido, pero no it's índice. Esta es una manera de hacerlo, pero parece poco elegante en el mejor.
//Remove the existing role assignment for the user.
int cnt = 0;
int assToDelete = 0;
foreach (SPRoleAssignment spAssignment in workspace.RoleAssignments)
{
if (spAssignment.Member.Name == shortName)
{
assToDelete = cnt;
}
cnt++;
}
workspace.RoleAssignments.Remove(assToDelete);
Lo que realmente me gustaría hacer es encontrar el elemento a eliminar por la propiedad (en este caso, el nombre) sin bucle a través de toda la colección y el uso de 2 variables adicionales.
Si desea acceder a los miembros de la colección por una de sus propiedades, puede considerar utilizar un Dictionary<T>
o KeyedCollection<T>
en su lugar. De este modo no tendrá que buscar el elemento que busca.
Si no, al menos podrías hacer esto
foreach (SPRoleAssignment spAssignment in workspace.RoleAssignments)
{
if (spAssignment.Member.Name == shortName)
{
workspace.RoleAssignments.Remove(spAssignment);
break;
}
}
¿De qué tipo es la colección? Si it's List
int cnt = workspace.RoleAssignments
.RemoveAll(spa => spa.Member.Name == shortName)
(Esto funciona en .NET 2.0. Por supuesto, si usted don't tiene el compilador más reciente, usted'll tiene que utilizar "delegado (SPRoleAssignment spa) { return spa.Member.Name == shortName; }" en lugar de la sintaxis lambda agradable).
Otro enfoque si no es un List
var toRemove = workspace.RoleAssignments
.FirstOrDefault(spa => spa.Member.Name == shortName)
if (toRemove != null) workspace.RoleAssignments.Remove(toRemove);
Esto requiere los métodos de extensión Enumerable. (Puedes copiar los de Mono, si estás atascado en .NET 2.0). Si se trata de alguna colección personalizada que no puede tomar un elemento, pero DEBE tomar un índice, algunos de los otros métodos Enumerable, como Select, pasan el índice entero por usted.