Crear una lista distinta de tipo personalizado en C #

Recibo una Lista de tipo de marco en entidad y solo quiero devolver los valores distintos de la Lista. Estoy usando el siguiente enfoque, sin embargo, no es uniquifying la lista. ¿Alguna sugerencia?

Param: List flags

 List distinctFlags = flags.Distinct().ToList(); 

Los valores de Flag son los siguientes: ID, Flag, FlagValue. ¿Puedo usar linq en esta instancia?

Gracias.

Asumiendo que Flag es uno de los modelos de su entidad, podría usar una class partial y anular Equals y GetHashCode . Esto también asume que tiene una propiedad Id en su class Flag que lo identifica de forma exclusiva.

 //this namespace MUST match the namespace of your entity model. namespace Your.Entity.Model.Namespace { public partial class Flag { public override bool Equals(object obj) { var item = obj as Flag; if (item == null) { return false; } return this.Id.Equals(item.Id); } public override int GetHashCode() { return this.Id.GetHashCode(); } } } 

El uso se vería así

 List distinctFlags = allFlags.Distinct().ToList(); 

Probablemente flags es una lista de tipo de referencia, y distinct no funciona como esperabas. Esto porque Distinct () no funciona en el valor del indicador en la lista, sino en sus referencias de memoria (que son todas diferentes).

Tienes que escribir una clase de comparador que enseñe a Distinct cómo comparar la bandera igual. Supongamos que tienes esta clase de banderas:

 public class flag { public string Name { get; set; } public string Code { get; set; } } 

deberías crear una clase comparer como esta:

 class FlagComparer : IEqualityComparer { // Products are equal if their names and product numbers are equal. public bool Equals(flag x, flag y) { //Check whether the compared objects reference the same data. if (Object.ReferenceEquals(x, y)) return true; //Check whether any of the compared objects is null. if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) return false; //Check whether the products' properties are equal. return x.Code == y.Code && x.Name == y.Name; } } 

y el llamado su statement:

 List distinctFlags = flags.Distinct(new FlagComparer ()).ToList(); 

De esta manera, el método Distinto sabe exactamente cómo comparar la istancia del indicador igual.

ACTUALIZAR

En base a su comentario, si desea seguir mi sugerencia, debe escribir la base del comparador de la siguiente manera:

 class FlagComparer : IEqualityComparer { // Products are equal if their names and product numbers are equal. public bool Equals(flag x, flag y) { //Check whether the compared objects reference the same data. if (Object.ReferenceEquals(x, y)) return true; //Check whether any of the compared objects is null. if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) return false; //Check whether the products' properties are equal. return x.HostID == y.HostID && x.RuleID == y.RuleID && x.Flag == y.Flag && x.FlagValue == y.FlagValue; } } 

Por supuesto, cada propiedad debe ser un tipo de valor.

Echa un vistazo aquí para aclararte:

  • Tipo de valor
  • Tipo de referencia