2017-02-17 3 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

Вы можете использовать LINQ для достижения этой цели

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

Убедитесь, что вы также сравнить случаи использования ToUpper и string вы хотите сравнить также сделать UpperCase

+0

Это приведет только к тому, что буквы находятся в том же порядке, что и в поисковом слове. Я хотел бы сказать тип в или вернуть камень – jsomers89

+0

Я думаю, вам нужно искать с помощью пар. – Mairaj

+0

@ jsomers89 Только одно, как появится соответствующее слово. Я имею в виду, как совместить слова 'или' или слово также может выглядеть как 'rk'? – Mairaj

1

Для вашего сценария, вам нужно проверить каждый символ слова в другом списке слов.

Для этого, вы можете сделать так:

// 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)) как условие.
Смежные вопросы