ใช้GroupBy
แต่โปรดทราบGroupBy
ว่าคุณควรจัดกลุ่มตามคอลัมน์ทั้งหมดเพราะถ้าคุณเพียงแค่จัดกลุ่มId
มันจะไม่ลบรายการที่ซ้ำกันเสมอไป ตัวอย่างเช่นพิจารณาตัวอย่างต่อไปนี้:
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());
ผลลัพธ์สำหรับการจัดกลุ่มนี้จะเป็น:
{Id = 1, Name = "Item1", Code = "IT00001", Price = 100}
{Id = 2, Name = "Item2", Code = "IT00002", Price = 200}
{Id = 3, Name = "Item3", Code = "IT00003", Price = 150}
ซึ่งไม่ถูกต้องเพราะถือว่า{Id = 3, Name = "Item3", Code = "IT00004", Price = 250}
ซ้ำกัน ดังนั้นแบบสอบถามที่ถูกต้องจะเป็น:
var distinctItems = a.GroupBy(c => new { c.Id , c.Name , c.Code , c.Price})
.Select(c => c.First()).ToList();
3.Override Equal
และGetHashCode
ใน class item:
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();
}
}
จากนั้นคุณสามารถใช้สิ่งนี้:
var distinctItems = a.Distinct();