【问题标题】:Contains without order包含无订单
【发布时间】:2017-02-17 04:26:40
【问题描述】:

我想使用一组字符搜索字符串列表,并且想找到匹配项而不管顺序如何。例如,如果我的列表包含

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

我希望能够使用“irb”进行搜索并让它返回bird。我必须这样做很多次,所以我正在寻找最有效的方法。

【问题讨论】:

    标签: c# linq contains


    【解决方案1】:
    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中的所有字母

    【讨论】:

      【解决方案2】:

      对于您的场景,您需要检查另一个单词列表中单词的每个字符。

      为此,您可以这样做:

          // 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));
      

      【讨论】:

        【解决方案3】:

        如果您不关心匹配重复项而不是检查您正在搜索的序列中的所有字符是否都包含在单词中,那么对于谓词来说:

         "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 =&gt; wordAsHashSet.Contains(c)) 作为条件。

        【讨论】:

          【解决方案4】:

          你可以使用 linq 来实现这个

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

          确保您还使用ToUpper 比较案例,并且您要比较的string 也使用UpperCase

          【讨论】:

          • 这只会找到字母与搜索词中出现的顺序相同的情况。我想说输入或带回摇滚
          • 我猜你必须使用对搜索。
          • @jsomers89 匹配词的显示方式只有一件事。我的意思是如何匹配单词or 或者单词也可以像rk 一样出现?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多