在开始时获得多个字符串的相等部分

Bit*_*lue 10 c# string

我有一些大的数组/文件名列表开始相同.像这样:

C:\Program Files\CCleaner\...
C:\Program Files\Common Files\...
C:\Program Files (x86)\Adobe\...
C:\Program Files (x86)\Common Files\...
Run Code Online (Sandbox Code Playgroud)

我想提取他们都有共同点的开头部分.
在这种情况下:"C:\Program Files"

我怎么做?

我想我可能要一次比较2个字符串并得到相同的开头.如果不手动比较每个字符,我甚至不知道怎么做?然后我将每个字符串与每个其他字符串进行比较?它会是O(n²)吗?有更好,更快的方式吗?

编辑:没有Linq还有办法吗?

Ste*_*ger 12

快速拍摄:

List<string> strings = ...;
var minimumLength = strings.Min(x => x.Length);
int commonChars;
for(commonChars = 0; commonChars < minimumLength; commonChars++)
{
  if (strings.Select(x => x[commonChars]).Distinct().Count() > 1)
  {
    break;
  }
}
return strings[0].Substring(0, commonChars);
Run Code Online (Sandbox Code Playgroud)

要么

var minimumLength = strings.Min(x => x.Length);
Enumerable
  .Range(0, minimumLength)
  .Count(i => strings.All(y => y[i] == strings[0][i]));
Run Code Online (Sandbox Code Playgroud)

没有Linq:

List<string> strings = ...;
var minimumLength = strings.Min(x => x.Length);
int commonChars;
for(commonChars = 0; commonChars < minimumLength; commonChars++)
{
  foreach(var str in strings)
  {
    if (str[commonChars] != strings[0][commonChars])
    {
      break;
    }
  }
}
return strings[0].Substring(0, commonChars);
Run Code Online (Sandbox Code Playgroud)

还有其他几种解决方案.

  • 我认为这是一个错字,应该是`strings.Select` ...? (5认同)