Utilisez GroupBy
, mais notez svp dans GroupBy
vous devriez Grouper par toutes les colonnes parce que si vous juste groupez par Id
il ne supprime pas toujours les articles en double. Par exemple, considérons l'exemple suivant:
List<Item> a = new List<Item>
{
new Item {Id = 1, Name = "Item1", Code = "IT00001", Price = 100},
new Item {Id = 2, Name = "Item2", Code = "IT00002", Price = 200},
new Item {Id = 3, Name = "Item3", Code = "IT00003", Price = 150},
new Item {Id = 1, Name = "Item1", Code = "IT00001", Price = 100},
new Item {Id = 3, Name = "Item3", Code = "IT00003", Price = 150},
new Item {Id = 3, Name = "Item3", Code = "IT00004", Price = 250}
};
var distinctItems = a.GroupBy(x => x.Id).Select(y => y.First());
Le résultat de ce regroupement sera:
{Id = 1, Name = "Item1", Code = "IT00001", Price = 100}
{Id = 2, Name = "Item2", Code = "IT00002", Price = 200}
{Id = 3, Name = "Item3", Code = "IT00003", Price = 150}
ce qui est incorrect parce qu'il considère {Id = 3, Name = "Item3", Code = "IT00004", Price = 250}
comme doublon. Ainsi, la requête correcte serait:
var distinctItems = a.GroupBy(c => new { c.Id , c.Name , c.Code , c.Price})
.Select(c => c.First()).ToList();
3.Remplacer Equal
et GetHashCode
en classe d'article:
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
public string Code { get; set; }
public int Price { get; set; }
public override bool Equals(object obj)
{
if (!(obj is Item))
return false;
Item p = (Item)obj;
return (p.Id == Id && p.Name == Name && p.Code == Code && p.Price == Price);
}
public override int GetHashCode()
{
return String.Format("{0}|{1}|{2}|{3}", Id, Name, Code, Price).GetHashCode();
}
}
Ensuite, vous pouvez l'utiliser comme ceci:
var distinctItems = a.Distinct();
J'ai une autre classe que la propriété des objets de classe aussi – Prasad
Vous pouvez également faire 'var ensemble = new HashSet(); var uniques = items.Where (x => set.Add (x.Id)); '. Il devrait être criminel de le faire .. –
nawfal