2 EYLÜL 2009, ÇARŞAMBA
Farklı Nesneleri bu SERİ ile çalışmıyor
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;
}
}
Bu eylem SERİ bir örnek dayanmaktadır. Listeleme 4.16.
Bu Jon Skeet iki kez yazdırır. Neden? Hatta Euals Yazar sınıfta geçersiz kılma yöntemi denedim. Hala Ayrı bir iş gibi görünmüyor. Neyi kaçırıyorum?
Edit: == Ekledik ve != operatör aşırı fazla. Hala yardım yok.
public static bool operator ==(Author a, Author b)
{
return true;
}
public static bool operator !=(Author a, Author b)
{
return false;
}
CEVAP
2 EYLÜL 2009, ÇARŞAMBA
SERİ Farklı özel nesneler söz konusu olduğunda o kadar da akıllı değildir.
Yaptığı tüm listenizi bakmak ve iki farklı nesne (üye alanları için aynı değere sahip olan hiçbir şey umurunda değil).
Bir geçici çözüm here gösterildiği gibi İEquatable arabirimi uygulamak için.
Senin gibi Yazar senin sınıf değiştirmek işe yarayacaktır.
public class Author : IEquatable<Author>
{
public string FirstName { get; set; }
public string LastName { get; set; }
public bool Equals(Author other)
{
if (FirstName == other.FirstName && LastName == other.LastName)
return true;
return false;
}
public override int GetHashCode()
{
int hashFirstName = FirstName == null ? 0 : FirstName.GetHashCode();
int hashLastName = LastName == null ? 0 : LastName.GetHashCode();
return hashFirstName ^ hashLastName;
}
}
Bunu Paylaş:
Seri belirli bir Özelliğin Farklı...
Seri hale getirilebilir genel liste XM...
SERİ Farklı Anonim Türleri ile Seçin...
Seri sınıfı özelliği ile farklı...
yavaş işlevi farklı nesneleri işlevler...