Verwenden Sie GroupBy
, aber bitte beachten Sie in GroupBy
sollten Sie nach allen Spalten gruppieren, denn wenn Sie nur nach Id
gruppieren, werden doppelte Einträge nicht immer entfernt. Zum Beispiel betrachten Sie das folgende Beispiel:
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());
Das Ergebnis für diese Gruppierung wird:
{Id = 1, Name = "Item1", Code = "IT00001", Price = 100}
{Id = 2, Name = "Item2", Code = "IT00002", Price = 200}
{Id = 3, Name = "Item3", Code = "IT00003", Price = 150}
was es ist falsch, weil es {Id = 3, Name = "Item3", Code = "IT00004", Price = 250}
als Duplikat betrachtet. Die richtige Abfrage wäre also:
3.Außer Kraft setzen Equal
und GetHashCode
in Artikel Klasse:
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();
}
}
Dann Sie es wie folgt verwenden können:
var distinctItems = a.Distinct();
ich eine andere Klasse als Eigenschaft haben, in den Artikel auch Klasse – Prasad
Sie auch tun können, 'var set = new HashSet(); var uniques = items.Where (x => set.Add (x.Id)); '. Es sollte kriminell sein, das zu tun. –
nawfal