단일 단계로 목록의 항목 색인을 얻는 방법은 무엇입니까? 어떻게해야합니까? 현재 이것은별로 좋지 않습니다. 색인을 얻기

반복하지 않고 목록에서 항목의 색인을 찾으려면 어떻게해야합니까?

현재 이것은별로 좋지 않습니다. 색인을 얻기 위해 동일한 항목의 목록을 두 번 검색하면됩니다.

var oProp = something;

int theThingIActuallyAmInterestedIn = myList.IndexOf(myList.Single(i => i.Prop == oProp));



답변

List.FindIndex 메서드어떻습니까 ?

int index = myList.FindIndex(a => a.Prop == oProp);

이 방법은 선형 검색을 수행합니다. 따라서이 방법은 O (n) 연산이며 여기서 n은 Count입니다.

항목을 찾지 못하면 -1을 반환합니다.


답변

간단한 유형의 경우 “IndexOf”를 사용할 수 있습니다.

List<string> arr = new List<string>();
arr.Add("aaa");
arr.Add("bbb");
arr.Add("ccc");
int i = arr.IndexOf("bbb"); // RETURNS 1.


답변

편집 : 당신이하는 경우 에만 사용 a List<>당신은 단지 인덱스가 필요하고 List.FindIndex실제로 가장 좋은 방법입니다. 나는 다른 것을 필요로하는 사람들을 위해이 대답을 남겨 둘 것입니다 (예 🙂 IEnumerable<>.

Select술어에서 인덱스를 사용하는 오버로드를 사용 하므로 목록을 (인덱스, 값) 쌍으로 변환하십시오.

var pair = myList.Select((Value, Index) => new { Value, Index })
                 .Single(p => p.Value.Prop == oProp);

그때:

Console.WriteLine("Index:{0}; Value: {1}", pair.Index, pair.Value);

또는 인덱스 원하고 여러 위치에서 이것을 사용하는 경우와 같은 자체 확장 방법을 쉽게 작성할 수 Where있지만 원래 항목을 반환하는 대신 조건 자와 일치하는 항목의 인덱스를 반환했습니다.


답변

LINQ를 사용하지 않으려면 다음을 수행하십시오.

int index;
for (int i = 0; i < myList.Count; i++)
{
    if (myList[i].Prop == oProp)
    {
       index = i;
       break;
    }
}

이렇게하면 목록을 한 번만 반복합니다.


답변

  1. List에서 문자열 값에 대한 인덱스를 찾는 간단한 솔루션입니다.

다음은 List Of String의 코드입니다.

int indexOfValue = myList.FindIndex(a => a.Contains("insert value from list"));
  1. List에서 정수 값에 대한 인덱스를 찾는 간단한 솔루션입니다.

정수 목록 코드는 다음과 같습니다.

    int indexOfNumber = myList.IndexOf(/*insert number from list*/);


답변

IEnumerable에 대한 복사 / 붙여 넣기 가능 확장 방법은 다음과 같습니다.

public static class EnumerableExtensions
{
    /// <summary>
    /// Searches for an element that matches the conditions defined by the specified predicate,
    /// and returns the zero-based index of the first occurrence within the entire <see cref="IEnumerable{T}"/>.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="list">The list.</param>
    /// <param name="predicate">The predicate.</param>
    /// <returns>
    /// The zero-based index of the first occurrence of an element that matches the conditions defined by <paramref name="predicate"/>, if found; otherwise it'll throw.
    /// </returns>
    public static int FindIndex<T>(this IEnumerable<T> list, Func<T, bool> predicate)
    {
        var idx = list.Select((value, index) => new {value, index}).Where(x => predicate(x.value)).Select(x => x.index).First();
        return idx;
    }
}

즐겨.


답변

누구든지 Array버전이 궁금하다면 다음과 같이 진행됩니다.

int i = Array.FindIndex(yourArray, x => x == itemYouWant);