【问题标题】:C# Array of strings contains string part from another array of stringsC# 字符串数组包含来自另一个字符串数组的字符串部分
【发布时间】:2021-04-27 14:10:55
【问题描述】:

有没有办法使用 LINQ 来查找一个字符串数组中的字符串是否包含另一个字符串数组中的(部分)字符串?像这样的:

string[] fullStrings = { "full_xxx_part_name", "full_ccc_part_name", "full_zzz_part_name" };
string[] stringParts = { "a_part", "b_part", "c_part", "e_part" }; 

// compare fullStrings array with stringParts array
// full_ccc_part_name contains c_part (first match is OK, no need to find all)
// return index 1 (index 1 from fullStrings array)

这是出于教育目的而提出的。 我知道 Linq 不会神奇地避免循环,而是在后台执行。

【问题讨论】:

  • 什么是循环问题?实际上,当您需要执行某些列表操作时,您必须以某种方式循环该列表,无论是显式使用for 还是任何循环或隐含地通过一些 linq 语句。跨度>

标签: c# .net


【解决方案1】:

您可以将Where + Any 与字符串方法一起使用:

string[] matches = fullStrings
     .Where(s => stringParts.Any(s.Contains))
     .ToArray();

如果您想以不区分大小写的方式进行比较,请使用IndexOf

string[] matches = fullStrings
     .Where(s => stringParts.Any(part => s.IndexOf(part, StringComparison.OrdinalIgnoreCase) >= 0))
     .ToArray();

如果你想要索引:

int[] matches = fullStrings 
     .Select((s, index) => (String: s, Index: index))
     .Where(x => stringParts.Any(x.String.Contains))
     .Select(x => x.Index)
     .ToArray();

【讨论】:

  • 想要的答案是第一个匹配的fullStrings项目的索引(见代码块中的//)
  • 问此类问题的用户的问题是,他们通常没有意识到内部使用了循环,并且倾向于在代码中的任何地方都使用 linq 而没有任何实际需要它。不过,我同意你的假设。
  • ^^ ...或者他们甚至认为他们自动“更有效率”。
  • 我想我们都曾在某个时候做出过这样的假设:|
  • 感谢您的回答。是的,这个问题是出于教育目的,而不是解决真正的问题。我完全知道,这只会隐藏循环。再一次感谢大家,没想到这么快就来了这么多cmets。我很感激。
【解决方案2】:

您当然需要使用某种类型的循环来查找索引。这是使用 Linq 的解决方案。 如果找到匹配项,这将返回第一个索引;如果没有找到匹配项,则返回 -1:

var index = fullStrings
              .Select((s,i) => (s, i))
              .Where(x => stringParts.Any(x.s.Contains))
              .Select(x => x.i)
              .DefaultIfEmpty(-1)
              .First();

【讨论】:

    猜你喜欢
    • 2012-07-20
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    相关资源
    最近更新 更多