Seleccione distinto usando linq

Tengo una lista de clase de clase

public class LinqTest { public int id { get; set; } public string value { get; set; } } List myList = new List(); myList.Add(new LinqTest() { id = 1, value = "a" }); myList.Add(new LinqTest() { id = 1, value = "b" }); myList.Add(new LinqTest() { id = 2, value = "c" }); 

Necesito seleccionar solo los identificadores distintos de esa lista. es decir, mi lista resultante solo debe contener

 [{id=1,value="a"},{ id = 2, value = "c" }] 

¿Cómo puedo hacer esto con linq?

Editar

Entrada,

 id value 1 a 1 b 2 c 3 d 3 e 

Fuera de juego debe ser,

 id value 1 a 2 c 3 d 

es decir, si hay una repetición de la id , el resultado debe tomar la primera ocurrencia solamente.

 myList.GroupBy(test => test.id) .Select(grp => grp.First()); 

Editar: como obtener este IEnumerable<> en una List<> parece ser un misterio para muchas personas, simplemente puede escribir:

 var result = myList.GroupBy(test => test.id) .Select(grp => grp.First()) .ToList(); 

Pero a uno le IEnumerable trabajar con IEnumerable lugar de IList ya que el Linq anterior se evalúa de forma perezosa: en realidad no hace todo el trabajo hasta que se repite el enumerable. Cuando llamas a ToList en realidad recorre todo el enumerable forzando todo el trabajo a realizarse por adelantado. (Y puede tomar un poco de tiempo si su enumerable es infinitamente largo).

La otra cara de este consejo es que cada vez que enumera tal IEnumerable el trabajo para evaluarlo tiene que hacerse de nuevo. Por lo tanto, debe decidir en cada caso si es mejor trabajar con IEnumerable evaluado perezosamente o realizarlo en una List , Set , Dictionary o lo que sea.

Usando morelinq puedes usar DistinctBy :

 myList.DistinctBy(x => x.id); 

De lo contrario, puede usar un grupo:

 myList.GroupBy(x => x.id) .Select(g => g.First()); 

Debe sobrescribir Equals y GetHashCode significativa, en este caso para comparar la ID:

 public class LinqTest { public int id { get; set; } public string value { get; set; } public override bool Equals(object obj) { LinqTest obj2 = obj as LinqTest; if (obj2 == null) return false; return id == obj2.id; } public override int GetHashCode() { return id; } } 

Ahora puede usar Distinct :

 List uniqueIDs = myList.Distinct().ToList(); 
 myList.GroupBy(i => i.id).Select(group => group.First())