2009-09-07 4 views
2

하여 특정 인스턴스를 찾기 위해 일반적인 목록 클래스를 찾기 방법을 사용합니까 내장 그것은 특정 인스턴스를 찾는 방법을 보여주지 않기 때문에 찾기 방법의 목록 상자어떻게 내가 컬렉션 클래스를 사용하고 싶습니다 내가</p> <p>(목록 상자)을 system.collections.generic.list이 이름

의 이름으로 특정리스트 박스를 찾기 위해 나는이 나를 위해 작동하지 않는 다음 MSDN 문서

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

발견 collectio에서 n을 콜렉션 이름으로 사용하십시오.

이 예제에서는 "saurus"의 검색 문자열을 Find 술어에 하드 코딩합니다. 검색 이름을 전달하고 싶습니다. 변수를 추가 할 때 FindListBox 함수를 만들면 서명이 일치하지 않는다는 오류가 발생합니다.

내 개인 클래스에 개인 메서드를 추가 할 수 있지만 지금은 일반에서 찾기를 구현하는 방법이 궁금합니다.

세스

답변

3

MSDN의 예제를 다음과 같이 확장 할 수 있습니다.

private static ListBox EndsWith(String s, List<ListBox> list) 
{ 
    return list.Find(
    delegate(ListBox l) 
    { 
     return l.Name.EndsWith(s); 
    } 
); 
} 

익명 대리자를 사용하여 검색을 수행합니다. 서명 오류가 발생하는 이유는 예제에 사용 된 EndsWithSaurus 메서드와 동일한이 대리자가 검색되는 형식의 단일 매개 변수를 가져와야하기 때문입니다. 나는 이것을 테스트하지 않았지만 이것은 내가 갈 곳이다. 대답 존에 대한

list.FirstOrDefault(x => x.Name.EndsWith("something"); 
+0

고마워. 그랬어. Seth –

+0

'FirstOrDefault'를 사용할 필요가 없습니다 - 당신은 여전히 ​​람다 식으로'List.Find'를 사용할 수 있습니다. –

+0

핸들 null을 잘 찾았습니까? FirstOrDefault를 사용하는 이유 중 하나는 아무것도 일치하지 않는 상황이 있기를 기대한다는 것입니다. –

6

당신이 C# 3 사용하고있는 가정 :

string nameToFind = "saurus"; 
ListBox found = list.Find(x => x.Name == nameToFind); 

2 C#의 경우를 :

string nameToFind = "saurus"; 
ListBox found = list.Find(delegate (ListBox x) { return x.Name == nameToFind; }); 

(예,이 여전히 그냥 샘플 값을 하드 코딩 그러나 nameToFind 변수는 메서드 매개 변수 또는 메서드 호출의 결과 일 수 있습니다.

+0

감사합니다 : 당신은 더 당신은 람다 표현식에서 C# 3.0을 사용할 수 있습니다, T의 목록을 소요하고

또는 T.를 반환하는 템플릿 방법이함으로써이 원리를 확장 할 수 있습니다. 다른 사람들에게 점수를줍니다 ... 그는 당신보다 더 많이 필요로합니다. ; /) 하지만 답은 효과가 있습니다. 그의 것과 같습니다. –

+0

그래, 그 생각을 계속 지켜라. 확실히 포인트를 사용할 수 있습니다 ... –

관련 문제