2010-12-21 14 views
35

List<T>'ü özel bir sınıfla kullanmaya çalışıyorum ve listede Contains(), Find() vb. gibi yöntemleri kullanabiliyorum. Ben sadece == operatörünü aşırı yüklemem gerektiğini düşündüm ama görünüşe göre, Find() ...Özel nesnelerle Liste <T> .Find() kullanarak C# -

ile bir temsilci yöntemi kullanmak için bir yol Not: Şu anda, ben Equals() yöntemi almak için aşırı yükledim Contains() yönteminin çalışması, ancak yine de Find() işlevini çalıştıramadım.

Her ikisini de işe almanın en iyi yolu ne olurdu?

En yeni C# /.NET framework versiyonunu linux üzerinde mono ile kullanıyorum.

düzenleme: İşte benim kodum

using System; 
namespace GuerreDesClans 
{ 
public class Reponse : IEquatable<Reponse> 
{ 
    public Reponse() 
    { 
     m_statement = string.Empty; 
     m_pointage = 0; 
    } 

    public Reponse (string statement, int pointage) 
    { 
     m_pointage = pointage; 
     m_statement = statement; 
    } 


    /* 
    * attributs privés 
    */ 

    private string m_statement; 
    private int m_pointage; 


    /* 
    * properties 
    */ 

    public string Statement { 
     get { return m_statement; } 
     set { m_statement = value; } 
    } 

    public int Pointage { 
     get { return m_pointage; } 
     set { m_pointage = value; } 
    } 

    /* 
    * Equatable 
    */ 

    public bool Equals (Reponse other) 
    { 
     if (this.m_statement == other.m_statement) 
      return true; 
     else 
      return false; 
    } 
} 

ve find() işlevini kullanarak Reponse nesnelerini nasıl aramak istiyorum ...

list.find("statement1"); // would return a Reponse object 
+1

nasıl 'Find' diyorsun? – SLaks

+3

Bazı kodları göster. –

cevap

49

Bul() öğesi, parametre olarak ilettiğiniz yüklemle eşleşen öğeyi bulacaktır, bu nedenle Eşittir() veya == işleci ile ilgili değildir.

Bu durumda
var element = myList.Find(e => [some condition on e]); 

, bir yüklem olarak bir lambda expression kullandık. Bu konuda okumak isteyebilirsiniz. Bul() durumunda, ifadeniz bir öğe almalı ve bir boole döndürmelidir. Senin durumunda

, olurdu:

var reponse = list.Find(r => r.Statement == "statement1") 

Ve yorumlarda soruyu cevaplamak için lambda ifadeleri tanıtıldı önce, bu .NET 2.0 eşdeğer şöyledir:

var response = list.Find(delegate (Response r) { 
    return r.Statement == "statement1"; 
}); 
+1

olarak okunuyor Bir .NET 2.0 örneği sağlayabilir misiniz? Unity3D içinde olan .net 2.0 arazi içinde sıkışmış durumdayım – gman

+0

Elbette, cevabımı düzenledim. –

+0

İade edilen öğenin bir referans olacağını ve bu değişikliklerin listede yer alan aynı öğeye yansıtılacağını düşünmek doğru mu? –

44

kullanabilirsiniz ... benim kod

using System; 
namespace GuerreDesClans 
{ 
public class Reponse : IEquatable<Reponse> 
{ 
    public Reponse() 
    { 
     m_statement = string.Empty; 
     m_pointage = 0; 
    } 

    public Reponse (string statement, int pointage) 
    { 
     m_pointage = pointage; 
     m_statement = statement; 
    } 


    /* 
    * attributs privés 
    */ 

    private string m_statement; 
    private int m_pointage; 


    /* 
    * properties 
    */ 

    public string Statement { 
     get { return m_statement; } 
     set { m_statement = value; } 
    } 

    public int Pointage { 
     get { return m_pointage; } 
     set { m_pointage = value; } 
    } 

    /* 
    * Equatable 
    */ 

    public bool Equals (Reponse other) 
    { 
     if (this.m_statement == other.m_statement) 
      return true; 
     else 
      return false; 
    } 
} 

}

ve ben bulmak() fonksiyonunu kullanarak Karşılık nesneleri aramak istiyorum nasıl Aşağıdaki gibi bir Öntanımlı olarak bulmak:

list.Find(x => x.Id == IdToFind); 

Bu, listedeki ilk nesneyi, yüklem tarafından tanımlanan koşulları karşılayan (yani örneğimde bir kimliğe sahip bir nesne arıyorum) listeyi döndürecektir.

+0

Bu teknik ne denir? – Pacane

+1

@Pacane: msdn'den - Tüm lambda ifadeleri lambda operatörünü kullanır =>, "gider" –

5

Önceki cevaplar, eşitlik operatörüne aşırı yüklediğinizi ve istenen öğeyi test etmek için bunu kullandığınızı dikkate almaz. Bu durumda, kod aşağıdaki gibi görünecektir: T >

list.Find(x => x == objectToFind); 

Veya, lambda sözdizimi sevmiyorum ve overriden Object.Equals (nesne) varsa veya IEquatable < uygulayan, bunu yapabilirdi :

list.Find(objectToFind.Equals); 
+0

Bu ifadelerin ikisi de gereksizdir, çünkü zaten objectToFind öğesine bir referansımız var. Find() noktası, başvuruda bulunmadığımız bir nesneyi bulmaktır. Listeyi kullanmak çok daha kolay, daha mantıklı ve okunabilir.Contains (objectToFind). –

+1

@Greg Sansom: Tabii ki. Ancak OP, özel olarak, İçindekiler yönteminin çalışmasına sahip olduğunu, ancak aynı zamanda Bul'u kullanmak istediğini söyledi. M_statement'i karşılaştırmak ve m_pointage değerini görmezden gelmek için Equidential'ı geçersiz kıldığından, Find yöntemi, kendisine iletilen aynı örneği döndürmek zorunda değildir. Eşitlik geçersiz kılma davranışları sorgulanabilir, ancak bu davranış göz önüne alındığında, 'list.Find (obj.Equals)' gereksiz değildir. – phoog

1

http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx

 // Find a book by its ID. 
     Book result = Books.Find(
     delegate(Book bk) 
     { 
      return bk.ID == IDtoFind; 
     } 
     ); 
     if (result != null) 
     { 
      DisplayResult(result, "Find by ID: " + IDtoFind); 
     } 
     else 
     { 
      Console.WriteLine("\nNot found: {0}", IDtoFind); 
     }