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

  • jat4011

    jat4011

    16 EKİM 2010
  • Justin Schenck

    Justin Schen

    24 Kasım 2006
  • LevelUpTuts

    LevelUpTuts

    20 Ocak 2012