문제

더 좋은 방법이 있을까요?

string[] s = {"zero", "one", "two", "three", "four", "five"};

var x = 
s
.Select((a,i) => new {Value = a, Index = i})
.Where(b => b.Value.StartsWith("t"))
.Select(c => c.Index);

즉내가 찾는 것이 더 효율적이거나 더 우아한 방법의 위치과 일치하는 제품 기준.

도움이 되었습니까?

해결책

당신은 쉽게 자신의 추가 확장 방법:

public static IEnumerable<int> IndexesWhere<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
    int index=0;
    foreach (T element in source)
    {
        if (predicate(element))
        {
            yield return index;
        }
        index++;
    }
}

다음 사용:

string[] s = {"zero", "one", "two", "three", "four", "five"};
var x = s.IndexesWhere(t => t.StartsWith("t"));

다른 팁

만약 당신이 그냥 사용하여 예를 배울 수 있는 방법을 LINQ,을 무시합니다.


그것은 명확하지 않다는 것을 나에게 LINQ 는 실제로 가장 좋은 방법입니다.코드는 아래 처럼 보인 것이 더 효율적이지 않기 때문에 새로운 익명 형식의 요구를 만들 수 있습니다.여,귀하의 예될 수 있 인위적인 기법을 수 있습니다 더 유용한 다른 상황에서,예를 들어 데이터 구조에 그것을 활용할 수 있는 인덱스에 값을 가지고 있지만,아래 코드는 합리적으로 똑바로 앞으로 이해할 수 있는(생각 없이 필수)그리고 틀림없이 더 효율적입니다.

string[] s = {"zero", "one", "two", "three", "four", "five"};
List<int> matchingIndices = new List<int>();

for (int i = 0; i < s.Length; ++i) 
{
   if (s[i].StartWith("t"))
   {
      matchingIndices.Add(i);
   }
}

보 미세요.저장할 수 있습니다 몇 가지 문자를 변경하여 선택:

.Select((Value, Index) => new {Value, Index})

또한 FindIndex 메서드에서 컬렉션 목록을 생성하기 위한 삭제 방법을 반환할 수 있는 인덱스에서 컬렉션입니다.참조할 수 있습니다 다음 링크에서 msdn http://msdn.microsoft.com/en-us/library/x1xzf2ca.aspx.

는 방법에 대해 이?이와 유사한 포스터의 하지만 나는 먼저 선택하는 인덱스와 그 컬렉션을 구축 할 수있는 기준과 일치하.

var x = s.Select((a, i) => i).Where(i => s[i].StartsWith("t"));

이것이 조금 더 적은 효율적인 보다는 몇 가지의 다른 답변으로 목록은 완전히 반복을 통해 두 번.

나이 논의 흥미로운 문제와 동료 처음에 생각 JonSkeet 의 솔루션은 좋았지만,동료를 지적했 하나의 문제,즉는 경우 기능 확장 IEnumerable<T>, 다음 사용될 수 있습 컬렉션을 구현합니다.

와 배열을,그것은 안전을 말하기 위해 생산 foreach 를 존중하는(i.e foreach 반복됩 처음부터 끝까지),그러나 그것은 반드시되지 않은 경우른 컬렉션(목록,사전 등),가 foreach 을 반영하지 않을 것입 반드시 "순서 항목에".아직 기능이있다,그것은 오해의 소지가 있을 수 있습니다.

에서는 비슷한 tvanfosson 의 대답이지만,확장으로,방법을 배열:

public static int[] GetIndexes<T>(this T[]source, Func<T, bool> predicate)
{
    List<int> matchingIndexes = new List<int>();

    for (int i = 0; i < source.Length; ++i) 
    {
        if (predicate(source[i]))
        {
            matchingIndexes.Add(i);
        }
    }
    return matchingIndexes.ToArray();
}

여기에서의 희망 List.ToArray 을 존중하기 위해 마지막 작업을...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top