framework - not in linq to sql c#
Seleccione distinto usando linq (4)
Debe anular significativamente Equals
y GetHashCode
, en este caso para comparar el 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 puedes usar Distinct
:
List<LinqTest> uniqueIDs = myList.Distinct().ToList();
Esta pregunta ya tiene una respuesta aquí:
- LINQ: valores distintos 7 respuestas
Tengo una lista de clase de clase
public class LinqTest
{
public int id { get; set; }
public string value { get; set; }
}
List<LinqTest> myList = new List<LinqTest>();
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 distintos ID 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 puesto debe ser,
id value
1 a
2 c
3 d
es decir, si hay una repetición de id
, el resultado debe tomar solo la primera aparición.
Usando morelinq puedes usar DistinctBy
:
myList.DistinctBy(x => x.id);
De lo contrario, puede utilizar un grupo:
myList.GroupBy(x => x.id)
.Select(g => g.First());
myList.GroupBy(i => i.id).Select(group => group.First())
myList.GroupBy(test => test.id)
.Select(grp => grp.First());
Edición: como 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 menudo es mejor trabajar con IEnumerable
lugar de IList
ya que el Linq anterior se evalúa perezosamente: en realidad no hace todo el trabajo hasta que se itera el enumerable. Cuando llama a ToList
en realidad recorre todo lo enumerable, obligando a que todo el trabajo se realice por adelantado. (Y puede tardar un poco si su enumerable es infinitamente largo).
La otra cara de este consejo es que cada vez que enumere tal IEnumerable
el trabajo para evaluarlo debe realizarse de nuevo. Por lo tanto, debe decidir para cada caso si es mejor trabajar con IEnumerable
evaluado perezosamente o realizarlo en una List
, Set
, Dictionary
o lo que sea.