SORU
11 Ocak 2009, Pazar


C# IEnumerable<T> özel IEqualityComparer ile Farklı

Yapmaya çalıştığım şey şu. Bana 3*^*bir IEnumerable veren bir XML dosyası XML ETMENİZ kullanarak sorgulama yapıyorum . nesne T benim "Köy" sınıf, bu sorgunun sonuçları ile dolu. Bazı sonuçlar Farklı gerçekleştirmek istediğim o kadar çoğaltılabilir, () IEnumerable nesne üzerinde, bunun gibi

public IEnumerable<Village> GetAllAlliances()
{
    try
    {
        IEnumerable<Village> alliances =
             from alliance in xmlDoc.Elements("Village")
             where alliance.Element("AllianceName").Value != String.Empty
             orderby alliance.Element("AllianceName").Value
             select new Village
             {
                 AllianceName = alliance.Element("AllianceName").Value
             };

        // TODO: make it work...
        return alliances.Distinct(new AllianceComparer());
    }
    catch (Exception ex)
    {
        throw new Exception("GetAllAlliances", ex);
    }
}

Varsayılan karşılaştırıcısı Köyü nesne için işe yaramaz gibi, burada AllianceComparer sınıfında görüldüğü gibi özel bir hayata,:

public class AllianceComparer : IEqualityComparer<Village>
{
    #region IEqualityComparer<Village> Members
    bool IEqualityComparer<Village>.Equals(Village x, Village y)
    {
        // Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(x, y)) 
            return true;

        // Check whether any of the compared objects is null.
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        return x.AllianceName == y.AllianceName;
    }

    int IEqualityComparer<Village>.GetHashCode(Village obj)
    {
        return obj.GetHashCode();
    }
    #endregion
}

() Farklı yöntem tam olarak onunla ya da onsuz sonuçlar aynı sayıda var gibi çalışamaz. Başka bir şey, ve genellikle bu mümkün mü bilmiyorum, ama ben yapamam AllianceComparer içine adım.() Eşittir sorun ne olabilir görmek için.

Umarım, birileri burada yanlış ne olabilir burada görebilirsiniz! Şimdiden teşekkürler!

CEVAP
11 Ocak 2009, Pazar


Sorun senin ile GetHashCode. AllianceName karma kodu yerine dönmek için değiştirmeniz gerekir.

int IEqualityComparer<Village>.GetHashCode(Village obj)
{
    return obj.AllianceName.GetHashCode();
}

Şey Equals nesneleri aynı Village farklı nesneler için geçerli değil aynı karma kodu olmalıdır true, döndürürse, AllianceName. Distinct karma tablo oluşturma tarafından DAHİLİ olarak çalışır beri, farklı hash kodları sayesinde uyumlu olmayacak eşit nesneler ile bitireceğiz.

Eğer iki dosya hash aynı değilse benzer şekilde, iki dosyaları karşılaştırmak için, dosyalar kendilerini kontrol etmek gerekmez. Onlarfarklı olmak. Aksi takdirde, kontrol etmek eğer onlar gerçekten aynı olup olmadığını görmeye devam edersiniz. Aynen Distinct kullanan karma tablo davranır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • How To Cook That

    How To Cook

    16 NİSAN 2011
  • Jon Reed

    Jon Reed

    14 AĞUSTOS 2006
  • Mega64

    Mega64

    24 ŞUBAT 2006