class Program
{
static void Main(string[] args)
{
List<Book> books = new List<Book>
{
new Book
{
Name="C# in Depth",
Authors = new List<Author>
{
new Author
{
FirstName = "Jon", LastName="Skeet"
},
new Author
{
FirstName = "Jon", LastName="Skeet"
},
}
},
new Book
{
Name="LINQ in Action",
Authors = new List<Author>
{
new Author
{
FirstName = "Fabrice", LastName="Marguerie"
},
new Author
{
FirstName = "Steve", LastName="Eichert"
},
new Author
{
FirstName = "Jim", LastName="Wooley"
},
}
},
};
var temp = books.SelectMany(book => book.Authors).Distinct();
foreach (var author in temp)
{
Console.WriteLine(author.FirstName + " " + author.LastName);
}
Console.Read();
}
}
public class Book
{
public string Name { get; set; }
public List<Author> Authors { get; set; }
}
public class Author
{
public string FirstName { get; set; }
public string LastName { get; set; }
public override bool Equals(object obj)
{
return true;
//if (obj.GetType() != typeof(Author)) return false;
//else return ((Author)obj).FirstName == this.FirstName && ((Author)obj).FirstName == this.LastName;
}
}
Esto se basa en un ejemplo en "LINQ in Action". Listado 4.16.Distinto no funciona con LINQ to Objects
Esto imprime Jon Skeet dos veces. ¿Por qué? Incluso he intentado anular el método Equals en la clase de Autor. Still Distinct no parece funcionar. ¿Qué me estoy perdiendo?
Edit: He añadido == y! = Sobrecarga del operador también. Todavía no hay ayuda.
public static bool operator ==(Author a, Author b)
{
return true;
}
public static bool operator !=(Author a, Author b)
{
return false;
}
IEtabletable está bien pero incompleto; debe * siempre * implementar Object.Equals() y Object.GetHashCode() juntos; IEtabletable .Equals no anula Object.Equals, por lo que esto no funcionará al realizar comparaciones no fuertemente tipadas, lo que ocurre a menudo en frameworks y siempre en colecciones no genéricas. –
AndyM
Entonces, ¿es mejor usar la anulación de Distinct que toma IEqualityComparer como lo ha sugerido Rex M? Quiero decir lo que debería estar haciendo si no quiero caer en la trampa. –
Tanmoy
@Tanmoy depende. Si desea que el Autor se comporte normalmente como un objeto normal (es decir, solo igualdad de referencia), pero verifique los valores del nombre con el propósito de Distinct, use un IEqualityComparer. Si * siempre * quiere que se comparen objetos de Autor en función de los valores de nombre, entonces anule GetHashCode e Igual, o implemente IEquatable. –