2010-12-21 2 views
35

List<T> 사용자 지정 클래스를 사용하고 목록에서 Contains(), Find() 등의 메서드를 사용할 수있게하려고합니다. 바로 지금, 내가 얻을 수있는 Equals() 방법을 오버로드했습니다 : 난 그냥목록 사용 <T>. 사용자 지정 개체로 .Find() 사용

주 ... 운영자 == 과부하하지만 분명히, 그 일을하는 한 가지 방법은 Find()에 위임 방법을 사용하는 것입니다 할 줄 알았는데 Contains() 메서드는 작동하지만 여전히 작동하려면 Find() 함수를 가져올 수 없습니다.

둘 다 작동시키는 가장 좋은 방법은 무엇입니까?

저는 최신 C# /.NET 프레임 워크 버전을 모노로 사용하고 있습니다.

편집 : 여기

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

가 어떻게'Find'를 호출? – SLaks

+3

몇 가지 코드를 보여주십시오. –

답변

49

Find()는 전달할 조건 자와 일치하는 요소를 찾을 것이므로 Equals() 또는 == 연산자와 관련이 없습니다.

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

이 경우에는 lambda expression을 술어로 사용했습니다. 이 기사를 읽으십시오. Find()의 경우 표현식은 요소를 취해 bool을 반환해야합니다. 귀하의 경우에는

, 그는 다음과 같습니다

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

그리고 의견의 질문에 대답하는 람다 표현식이 도입되기 전에,이 .NET 2.0에 상응입니다 :

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

.NET 2.0 예제를 제공 할 수 있습니까? 나는 Unity3D에 갇혀있다 .net2.0 땅 – gman

+0

물론, 나는 나의 대답을 편집했다. –

+0

반환 된 요소가 참조이고 모든 수정 내용이 목록에 포함 된 동일한 요소에 반영된다고 생각하십니까? –

44

당신은 사용할 수 있습니다 ... 내 코드

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; 
    } 
} 

}

내가 찾기() 함수를 사용하여 내 Reponse 객체를 검색하고자하는 방법 술어를 다음과 같이 찾으십시오.

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

이것은 술어에 정의 된 조건을 만족하는 목록의 첫 번째 객체를 반환합니다 (예를 들어 ID가있는 객체를 찾고 있습니다).

+0

이 기술은 무엇이라고 불 립니? – Pacane

+1

@Pacane : msdn에서 - 모든 람다 식은 람다 연산자 =>를 사용합니다. "가는 곳"으로 읽습니다. –

5

이전 답변에서는 equals 연산자가 오버로드되어 검색된 요소를 테스트하는 데 사용하고 있다는 사실을 설명하지 않습니다. 이 경우, 귀하의 코드는 다음과 같습니다 T >를

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

를 또는, 람다 구문처럼하지 않으며, 오버라이드 (override) 일반적으로, Object.equals (Object)는 경우 또는 IEquatable <를 구현 한, 당신이 할 수 :

list.Find(objectToFind.Equals); 
+0

우리는 이미 objectToFind에 대한 참조가 있으므로이 두 문장은 모두 중복됩니다. Find()의 요점은 참조가없는 객체를 찾는 것입니다. list.Contains (objectToFind)를 사용하는 것이 훨씬 쉽고 논리적이며 읽기 쉽습니다. –

+1

@ 그렉 산삼 : 물론. 그러나 OP는 구체적으로 Contains 메서드가 작동하지만 Find를 사용하려고한다고 말했습니다. m_statement를 비교하고 m_pointage의 값을 무시하기 위해 Equals를 재정의 했으므로 Find 메서드는 전달 된 동일한 인스턴스를 반드시 반환하지는 않습니다. 같음 오버라이드의 동작은 의문 스러울 지 모르지만 그 동작을 감안할 때'list.Find (obj.Equals)'는 중복되지 않습니다. – 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); 
     } 
관련 문제