C#에서 목록에서 요소를 검색하는 가장 빠른 방법은 무엇입니까? 그러나 "startswith ()"검색을 수행합니까?

StackOverflow https://stackoverflow.com/questions/19849923

문제

문자열 목록이 있습니다.

 var list = new List<string>();
 list.Add("CAT");
 list.Add("DOG");

var listofItems = new List<string>();
 listofItems .Add("CATS ARE GOOD");
 listofItems .Add("DOGS ARE NICE");
 listofItems .Add("BIRD");
 listofItems .Add("CATAPULT");
 listofItems .Add("DOGGY");

그리고 이제 나는 다음과 같은 기능을 원합니다.

 listofItems.Where(r=> list.Contains(r));

그러나 포함하는 대신, 나는 그것을 확인하여 시작하기를 원합니다. 그래서 5 개의 항목 중 4 개가 반환됩니다 (새는 그렇지 않을 것입니다).

가장 빠른 방법은 무엇입니까?

도움이 되었습니까?

해결책

당신이 사용할 수있는 시작합니다 안에 어느

listofItems.Where(item=>list.Any(startsWithWord=>item.StartsWith(startsWithWord)))

이것을 두 배로 시각화 할 수 있습니다 for 두 번째로 루프 for 닿 자마자 헤어진 a true 사례

var filteredList = new List<String>();
foreach(var item in listOfItems)
{
    foreach(var startsWithWord in list)
    {
        if(item.StartsWith(startsWithWord))
        {
            filteredList.Add(item)
            break;
        }
    }
}
return filteredList;

다른 팁

가장 빠른 방법은 다른 데이터 구조 (예 : TRIE)를 사용하는 것입니다. 기본 C# 구현은 여기에서 찾을 수 있습니다. https://github.com/kpol/trie

이렇게하면 더 단순화 된 형식으로 필요한 것을 얻을 수 있습니다.

 var result = listofItems.Select(n =>
 {
      bool res = list.Any(v => n.StartsWith(v));
      return res 
               ? n 
               : string.Empty;
 }).Where(b => !b.Equals(string.Empty));

트리 데이터 구조는 필요한 것입니다. 이 더 성숙한 라이브러리를 살펴보십시오. Trienet

using Gma.DataStructures.StringSearch;

...

var trie = new SuffixTrie<int>(3);

trie.Add("hello", 1);
trie.Add("world", 2);
trie.Add("hell", 3);

var result = trie.Retrieve("hel");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top