programing

Linkq를 사용하여 목록에서 일치하는 모든 값의 인덱스 가져오기

iphone6s 2023. 5. 17. 22:35
반응형

Linkq를 사용하여 목록에서 일치하는 모든 값의 인덱스 가져오기

안녕하세요, 린크 전문가들입니다.

저는 방금 매우 비슷한 질문을 던졌고 솔루션이 아마도 매우 쉽다는 것을 알고 있지만, 여전히 linq를 사용하여 이 꽤 간단한 작업을 가장 효율적으로 수행하는 방법에 대해 제 머리를 감을 수 없습니다.

제 기본 시나리오는 예를 들어 다음과 같은 값 목록이 있는 경우입니다.

Lst1:
a
a
b
b
c
b
a
c
a

그리고 Lst1의 모든 인덱스(예: 값 = "a")를 저장할 새 목록을 만들고 싶습니다.이 예에서는 다음과 같은 이점이 있습니다.

LstIndexes:
0
1
6
8

Loops(Linq에게 유리하게)를 사용하여 이 작업을 수행할 수 있다는 것을 알고 있으며, 다음과 같은 방법으로 Linq를 사용하여 이 작업을 수행하는 방법도 마찬가지입니다.

LstIndexes= Lst1.Select(Function(item As String, index As Integer) index) _
                .Where(Function(index As Integer) Lst1(index) = "a").ToList

이것에 대한 저의 과제는 목록을 두 번 반복하기 때문에 비효율적이라는 것입니다.

어떻게 하면 린크를 사용하여 가장 효율적인 방법으로 결과를 얻을 수 있습니까?

감사합니다!!!!

먼저, 코드는 목록에서 두 번 반복되지 않고 한 번만 반복됩니다.

그렇긴 하지만, 당신의Select정말로 모든 인덱스의 시퀀스를 얻는 것입니다. 그것은 더 쉽게 수행됩니다.Enumerable.Range:

var result = Enumerable.Range(0, lst1.Count)
             .Where(i => lst1[i] == "a")
             .ToList();

목록이 실제로 두 번 반복되지 않는 이유를 이해하려면 익숙해지는 데 시간이 걸립니다.기본적인 설명을 해보도록 하겠습니다.

파이프라인으로 선택 및 위치 지정과 같은 대부분의 LINQ 방법을 생각해야 합니다.각각의 방법은 약간의 작은 일을 합니다.의 경우에는Select방법을 지정하면 기본적으로 "누군가가 나에게 다음 항목을 요청할 때마다 나는 먼저 내 항목에 대한 입력 순서를 묻고, 그 다음에는 내가 그것을 다른 것으로 변환해야 하는 방법을 사용하고, 그 다음에는 나를 사용하는 사람에게 그 항목을 제공할 것입니다."라고 말합니다.Where"누군가가 나에게 아이템을 요청할 때마다 나는 아이템에 대한 내 입력 순서를 물어볼 것이고, 기능이 좋다고 하면 전달할 것이고, 그렇지 않다면 나는 합격한 아이템을 얻을 때까지 계속해서 아이템을 요청할 것이다."라고 말합니다.

그래서 당신이 그들을 묶을 때 일어나는 일입니다.ToList첫 번째 항목을 요청하면 다음으로 이동합니다.Where첫 번째 아이템으로,Where로 이동Select첫 번째 아이템을 달라고 하면,Select목록으로 이동하여 첫 번째 항목을 요청합니다.그런 다음 목록은 첫 번째 항목을 제공합니다. Select그런 다음 해당 항목을 뱉어야 하는 항목(이 경우에는 int 0만)으로 변환하여 에 제공합니다.Where.Where은 그것이판단하고 입니다.0ToList목록에 추가할 수 있습니다.그 모든 일이 9번 더 일어납니다.은 즉을 합니다.Select목록에서 각 항목을 정확히 한 번만 요청하게 되고 각 결과를 직접 제공합니다.Where그러면 "테스트에 합격"한 결과를 ToList에 직접 공급하고 ToList는 이 결과를 저장합니다.모든 LINQ 방법은 소스 시퀀스를 한 번(한 번 반복할 때)만 반복하도록 신중하게 설계되었습니다.

처음에는 복잡해 보이지만 실제로는 컴퓨터가 이 모든 것을 쉽게 수행할 수 있습니다.실제로 처음처럼 성능 집약적이지는 않습니다.

이것은 효과가 있지만, 거의 틀림없이 그렇게 깔끔하지는 않습니다.

var result = list1.Select((x, i) => new {x, i})
                  .Where(x => x.x == "a")
                  .Select(x => x.i);

이것은 어떻습니까, 저에게 꽤 잘 맞습니다.

   static void Main(string[] args)
    {
        List<char> Lst1 = new List<char>();
        Lst1.Add('a'); 
        Lst1.Add('a');   
        Lst1.Add('b');   
        Lst1.Add('b');   
        Lst1.Add('c');   
        Lst1.Add('b');   
        Lst1.Add('a');   
        Lst1.Add('c');
        Lst1.Add('a');

        var result = Lst1.Select((c, i) => new { character = c, index = i })
                         .Where(list => list.character == 'a')
                         .ToList();
    }

언급URL : https://stackoverflow.com/questions/13055391/get-indexes-of-all-matching-values-from-list-using-linq

반응형