¿Cómo funciona Distinct ()?

Digamos que tengo esto:

class Foo
{
    public Guid id;
    public string description;
}

var list = new List<Foo>();
list.Add(new Foo() { id = Guid.Empty, description = "empty" });
list.Add(new Foo() { id = Guid.Empty, description = "empty" });
list.Add(new Foo() { id = Guid.NewGuid(), description = "notempty" });
list.Add(new Foo() { id = Guid.NewGuid(), description = "notempty2" });

Ahora, cuando hago esto:

list = list.Distinct().Tolist();

Obviamente devuelve 4 elementos. Me gustaría un método, que compare todos los datos que tengo en clase y que devuelva elementos únicos, algo que verifique cada propiedad de la clase. ¿Necesito escribir mi propio comparador, o hay algo que está incorporado que funciona de esta manera?

Respuestas a la pregunta(2)

Su respuesta a la pregunta