una - separar palabra en letras c#
La forma más rápida de encontrar el complemento de dos colecciones en C# (3)
Tengo dos colecciones de tipo ICollection<MyType>
llamadas c1
y c2
. Me gustaría encontrar el conjunto de elementos que están en c2
que no están en c1
, donde la heurística para la igualdad es la propiedad Id
en MyType
.
¿Cuál es la forma más rápida de realizar esto en C # (3.0)?
Si usa C # 3.0 + Linq:
var complement = from i2 in c2
where c1.FirstOrDefault(i1 => i2.Id == i1.Id) == null
select i2;
Bucle a través del complemento para obtener los artículos.
Use Enumerable.Except
y, específicamente, la overload que acepta un IEqualityComparer<MyType>
:
var complement = c2.Except(c1, new MyTypeEqualityComparer());
Tenga en cuenta que esto produce la diferencia establecida y, por lo tanto, los duplicados en c2
solo aparecerán en el IEnumerable<MyType>
una vez. Aquí necesitas implementar IEqualityComparer<MyType>
como algo así como
class MyTypeEqualityComparer : IEqualityComparer<MyType> {
public bool Equals(MyType x, MyType y) {
return x.Id.Equals(y.Id);
}
public int GetHashCode(MyType obj) {
return obj.Id.GetHashCode();
}
}
public class MyTypeComparer : IEqualityComparer<MyType>
{
public MyTypeComparer()
{
}
#region IComparer<MyType> Members
public bool Equals(MyType x, MyType y)
{
return string.Equals(x.Id, y.Id);
}
public int GetHashCode(MyType obj)
{
return base.GetHashCode();
}
#endregion
}
Luego, usando Linq:
c3 collection = new collection().add(c1);
c3.add(c2);
var items = c3.Distinct(new MyTypeComparer());
También puedes hacerlo usando genéricos y predicados. Si necesitas una muestra, házmelo saber.