Я думаю, Uri Class сможет помочь в этом случае. Я не на машине VS, где я могу проверить; однако передайте конструктору Uri строку URL-адреса и попробуйте свойство Host для сравнения:
List<string> distinctHosts = new List<string>();
foreach (string url in UrlList)
{
Uri uri = new Uri(url)
if (! disctinctHosts.Contains(uri.Host))
{
distinctHosts.Add(uri.Host);
}
}
Это выглядит немного примитивно и, возможно, может быть более элегантным - возможно, без foreach
; но, как я уже сказал, я не на машине для разработки, где я мог бы работать с ней.
Я думаю, что это сможет обработать любой вариант действительного URL. Создание ArrayList не очень хорошая идея; по моему мнению, Regex потребовал бы, чтобы вы поддерживали какой-то собственный 'MatchList', который мог бы стать громоздким.
Как указывает @Damokles, у вас должна быть некоторая форма проверки. Для класса Uri требуется протокол: 'http://' или' ftp: // '. Вы не хотите предполагать, что «badurl.com» действительно недействителен; однако:
if (!url.StartsWith("http://")) { /* add protocol */ } // then check Host domain as above
... должно быть достаточно просто для получения отдельного имени хоста или домена. Я рекомендую любой вариант, который не требует угадывания позиции индекса какой-либо части URL, поскольку он тесно связан с конкретными форматами.