Поскольку все лучше всего решить с помощью LINQ *:
* не все лучше всего решить с помощью LINQ.
using System.Collections.Generic;
using System.IO;
using System.Linq;
class Program
{
static void Main(string[] args)
{
List<string> Files = new List<string>()
{
@"c:\abc\pqr\tmp\sample\b.txt",
@"c:\abc\pqr\tmp\new2\c1.txt",
@"c:\abc\pqr\tmp\b2.txt",
@"c:\abc\pqr\tmp\b3.txt",
@"c:\a.txt"
};
var MatchingChars =
from len in Enumerable.Range(0, Files.Min(s => s.Length)).Reverse()
let possibleMatch = Files.First().Substring(0, len)
where Files.All(f => f.StartsWith(possibleMatch))
select possibleMatch;
var LongestDir = Path.GetDirectoryName(MatchingChars.First());
}
}
Объяснение:
Первая строка получает список длин возможных совпадений для оценки.Сначала мы хотим получить самую длинную возможность (поэтому я переворачиваю перечисление, которое было бы 0, 1, 2, 3; превращая его в 3, 2, 1, 0).
Затем я получаю строку для сопоставления, котораяэто просто подстрока первой записи заданной длины.
Затем я фильтрую результаты, чтобы убедиться, что мы включаем только возможные совпадения, с которых начинаются все файлы.
Наконец, я возвращаю первоерезультат, который будет самой длинной подстрокой, и вызовите path.getdirectoryname, чтобы убедиться, что у чего-то есть несколько идентичных букв в именах файлов, которые не включены.