2013-06-23 4 views
11

MyListList<Person>Name 속성이 "ComTruise"로 설정된 Person이있을 수 있습니다. 그 목록에 그 색인 Person이 필요합니다. Person이 아니라 색인입니다.해당 속성이 지정된 목록의 항목 색인을 가져옵니다.

string myName = ComTruise; 
int thatIndex = MyList.SkipWhile(p => p.Name != myName).Count(); 

내가 더 나은 또는 동일한 작업을 수행하기 위해 같이 IndexOf 메서드를 사용하여 할 수있는 방법은?

내가 지금 무엇을한다하고 있어요

+2

... –

+0

은 myList에 자신의 컬렉션을인가하거나 목록 입니다? –

+0

죄송합니다. IndexOf의 구문은 어떻게됩니까? – Sturm

답변

12

그것이 ObservableCollection있어, 당신은 "ComTruise는"컬렉션에 존재하지 않는 경우이

int index = MyList.IndexOf(MyList.Where(p => p.Name == "ComTruise").FirstOrDefault()); 

그것은 -1를 반환합니다 시도 할 수 있습니다.

주석에서 언급했듯이 두 검색을 수행합니다. for 루프로 최적화 할 수 있습니다.

int index = -1; 
for(int i = 0; i < MyList.Count; i++) 
{ 
    //case insensitive search 
    if(String.Equals(MyList[i].Name, "ComTruise", StringComparison.OrdinalIgnoreCase)) 
    { 
     index = i; 
     break; 
    } 
} 
+0

그래서 먼저 그것을 찾은 다음 다시 찾으십시오. 그건 꽤 비효율적입니다. – svick

+0

맞아요. 목록이 꽤 큰 경우 For 루프가 더 좋을 것입니다. 내 대답을 업데이트했습니다. – keyboardP

+0

비교를 변경하여 부분 문자열에 일치시키는 이유가 무엇입니까? 예를 들어''X-ComTruise ''의 이름은 대소 문자를 구별하지 않는 검색과 일치합니다. – svick

0
var p = MyList.Where(p => p.Name == myName).FirstOrDefault(); 
int thatIndex = -1; 
if (p != null) 
{ 
    thatIndex = MyList.IndexOf(p); 
} 

if (p != -1) ... 
17

당신은 사용할 수 FindIndex

string myName = "ComTruise"; 
int myIndex = MyList.FindIndex(p => p.Name == myName); 

참고 : FindIndex -1을 반환 공급 조건에 의해 정의 된 조건에 일치하는 항목이 목록에서 발견되지 않는 경우.

+0

Arg, 실제로 ObservableCollection이고 List가 아닌데, 뭔가 있습니까? 나는이 특별한 경우에 그것이 같다고 생각했다. – Sturm

+0

ObservableCollection을 .ToList() 메서드를 사용하여 List로 변환하면 매우 잘 작동합니다. 고맙습니다! – Sturm

+0

크래킹은 확실히 당신을 정렬 할 것입니다.하지만 변환 없이도 할 수 있습니다 (다른 답변은 이미 어떻게 = D를 보여 줬는가). – Chris

6

그것은이 작업을 수행하는 간단한 확장 메서드를 작성하는 의미가 있습니다

거의 같이 IndexOf가하는 일입니다
public static int FindIndex<T>(
    this IEnumerable<T> collection, Func<T, bool> predicate) 
{ 
    int i = 0; 
    foreach (var item in collection) 
    { 
     if (predicate(item)) 
      return i; 
     i++; 
    } 
    return -1; 
} 
관련 문제