我有一些大的数组/文件名列表开始相同.像这样:
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)
还有其他几种解决方案.