SORU
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ş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • george sarintzotis

    george sarin

    2 Aralık 2007
  • MagmaRhino

    MagmaRhino

    16 Temmuz 2011
  • Wild Academy

    Wild Academy

    8 Aralık 2009