SORU
6 NİSAN 2009, PAZARTESİ


İki nesne seri ile listeleri birleştirme

Şu durum var

Class Person
{
    string Name
    int Value
    int Change
}

List<Person> list1
List<Person> list2

Yeni bir Liste içine 2 listeler birleştirmek istiyorum kayıt ismi olurdu birleştirmek aynı kişi olma ihtimaline karşı, list2, değişiklik insanın değeri list2 - list1 değerini olurdu. Değişim yinelenen hayır ise 0

CEVAP
9 Ocak 2010, CUMARTESİ


Bu kolayca Etmeniz uzantısı yöntem Birliği ile yapılabilir. Örneğin:

var mergedList = list1.Union(list2).ToList();

Bu iki liste birleştirilir Listesini döndürür ve iki katına çıkarılır. Eğer benim örnekte olduğu gibi Birlik uzatma yöntemi karşılaştırıcısı belirtmeniz yok eğer doğru değilse, İnsan sınıfında varsayılan Equals ve GetHashCode yöntemlerini kullanacaktır. Örneğin, kendi Adı özelliği karşılaştırarak kişiler karşılaştırmak istiyorsanız, bu yöntemleri karşılaştırma yapmak için geçersiz kılmak gerekir. Bunu yapmak için aşağıdaki kod örneği bakın. Kişi kendi sınıfı için bu kodu eklemelisiniz.

/// <summary>
/// Checks if the provided object is equal to the current Person
/// </summary>
/// <param name="obj">Object to compare to the current Person</param>
/// <returns>True if equal, false if not</returns>
public override bool Equals(object obj)
{        
    // Try to cast the object to compare to to be a Person
    var person = obj as Person;

    return Equals(person);
}

/// <summary>
/// Returns an identifier for this instance
/// </summary>
public override int GetHashCode()
{
    return Name.GetHashCode();
}

/// <summary>
/// Checks if the provided Person is equal to the current Person
/// </summary>
/// <param name="personToCompareTo">Person to compare to the current person</param>
/// <returns>True if equal, false if not</returns>
public bool Equals(Person personToCompareTo)
{
    // Check if person is being compared to a non person. In that case always return false.
    if (personToCompareTo == null) return false;

    // If the person to compare to does not have a Name assigned yet, we can't define if it's the same. Return false.
    if (string.IsNullOrEmpty(personToCompareTo.Name) return false;

    // Check if both person objects contain the same Name. In that case they're assumed equal.
    return Name.Equals(personToCompareTo.Name);
}

Eğer Kişi kendi sınıfının Equals yöntemi varsayılan Adını her zaman iki nesne karşılaştırmak için kullanmak üzere ayarlamak için istemiyorsun. öyleyse de IEqualityComparer arayüzü kullanan karşılaştırıcısı bir sınıf yazabilirsiniz. Sonra Seri uzantısı Birliği yönteminde ikinci parametre olarak bu karşılaştırıcısı sağlayabilir. Bu karşılaştırıcısı bir yöntem yazma hakkında daha fazla bilgi http://msdn.microsoft.com/en-us/library/system.collections.iequalitycomparer.aspx bulunabilir

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bcbauer

    bcbauer

    7 ŞUBAT 2007
  • jat4011

    jat4011

    16 EKİM 2010
  • Kevin Bruckert

    Kevin Brucke

    30 Aralık 2006