usar una separar recortar por palabra letras extraer ejemplos como caracteres caracter cadena buscar c# .net linq complement set-operations

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.