2017-02-17 4 views
1

일련의 문자를 사용하여 문자열 목록을 검색하고 순서에 관계없이 일치하는 항목을 찾고 싶습니다. 예를 들어 내 목록주문하지 않음

List<string> testList = new List<string>() { "can", "rock", "bird" }; 

내가 "IRB"을 사용하여 검색 할 수있는과 조류를 반환이 포함 된 경우. 나는이 일을 가장 효율적으로 수행 할 수 있도록 여러 번해야한다.

답변

4
var query = "irb"; 
List<string> testList = new List<string>() { "can", "rock", "bird" }; 

var result = testList.Where(i => query.All(q => i.Contains(q))); 

testList 시험의 각 항목에 대해보고 당신은 상관하지 않는 경우가 query

0

당신은 당신이 또한 ToUpper를 사용하는 경우를 비교하고는 string 당신이 시나리오에 대한 UpperCase

+0

문자가 검색 단어에 나타나는 순서와 동일한 순서로 검색되는 경우에만 찾습니다. 나는 타입을 말하고 싶습니다 또는 바위를 가져 오십시오 – jsomers89

+0

나는 쌍을 사용하여 검색해야 할 것 같아요. – Mairaj

+0

@ jsomers89 일치하는 단어가 어떻게 나타날지 한 가지. 나는'또는'단어를 어떻게 매치시키는지를'rk'처럼 보일 수 있다는 것을 의미합니까? – Mairaj

1

, 당신은 확인해야 할도 비교할이

List<string> testList = new List<string>() { "can", "rock", "bird" }; 
var lst = testList.Where(x => x.ToUpperInvariant().Contains("IRD")).ToList(); 

확인 달성하기 위해 LINQ를 사용할 수 있습니다 단어의 또 다른 목록에있는 단어의 각 문자. 이를 위해

, 다음과 같이 할 수 있습니다

// Checks whether all character in word is present in another word 
    Func<string, string, bool> isContain = (s1, s2) => 
    { 
     int matchingLength = 0; 
     foreach (var c2 in s2.ToCharArray()) 
     { 
      foreach (var c1 in s1.ToCharArray()) 
      { 
       if (c1 == c2) 
        ++matchingLength; 
      } 
     } 

     // if matched length is equal to word length given, it would be assumed as matched 
     return s2.Length == matchingLength; 
    }; 

    List<string> testList = new List<string>() { "can", "rock", "bird" }; 
    string name = "irb"; 
    var fileredList = testList.Where(x => isContain(x, name)); 
1

의 모든 문자가 포함 된 경우 검색하는 시퀀스의 모든 문자가 단어에 포함되어 있는지 확인하는 것보다 중복을 비교하는 것이 술어에 대해 수행 할 수 있습니다.

"irb".Except("bird").Count() == 0 

그리고 전체 조건:

List<string> testList = new List<string>() { "can", "rock", "bird" }; 
    var search = "irb"; 
    var matches = testList.Where(word => !search.Except(word).Any()); 

참고 :

  • 당신은 당신이 맞게 혼합 된 경우 문자를 필요로하는 경우 소문자로 모든 단어를 정상화 할 필요가있다.
  • 다른 값을 검색하는 성능이 중요한 경우 - 검색 문자열을 먼저 HashSet으로 변환하고 수동으로 제외합니다.
  • 동일한 목록에 대해 여러 값을 여러 번 일치시켜야하는 경우 - 문자열 목록을 HashSet 목록으로 변환하고 search.All(c => wordAsHashSet.Contains(c))을 조건으로 사용하십시오.