Задать вопрос
@Xveeder

Как удалить такие дубли из списка C#?

Есть список, в нём лежат ссылки, среди них встречаются дубли вида:

https://mysite.com/
https://mysite.com/post/168755988566


Задача: нужно удалить из списка вот такие элементы:
https://mysite.com/post/168755988566
И оставить только такие:
https://mysite.com/
  • Вопрос задан
  • 535 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@ProTreo
Так ?
void Main()
{
	var urls = new List<string>();
	urls.Add("https://mysite1.com/");
	urls.Add("https://mysite2.com/");
	urls.Add("https://mysite3.com/");
	urls.Add("https://mysite4.com/");
	urls.Add("https://mysite1.com/post/168755988566");
	urls.Add("https://mysite2.com/post/168755988566");
	urls.Add("https://mysite3.com/post/168755988566");
	urls.Add("https://mysite4.com/post/168755988566");
	
	var regexPattern = "\\/post\\/\\d*";
	var r = new Regex(regexPattern);
	
	var filteredUrls = urls.Select(x => x).Where(x => !r.IsMatch(x));
	
	foreach (var url in filteredUrls)
	{
		Console.WriteLine(url);
	}
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
EreminD
@EreminD
Кое-что умею
Нам понадобится LINQ
Ход мысли такой:
  1. Берем список ссылок
  2. Кастуем каждую к типу Uri
  3. Забираем у каждой левую часть
  4. Делаем Distinct колеекции
var urls = new List<string>() {"https://mysite1.com/", "https://mysite2.com/",
                                           "https://mysite3.com/", "https://mysite4.com/",
                                           "https://mysite1.com/test", "https://mysite2.com/test",
                                          "https://mysite5.com/", "https://mysite5.com/234234/23434/sdfas"};
            
 List<String> uris = urls.Select(x => new Uri(x).GetLeftPart(UriPartial.Authority)).Distinct().ToList();
 uris.ForEach(x => Console.WriteLine(x));
Ответ написан
Комментировать
@cicatrix
было бы большой ошибкой думать
Список большой?

Вот адская регулярка, которая выбирает вообще любые ссылки из любого текста.
Вам нужны группы с 1-й по 6-ю.
((https?|ftp):\/\/)?([a-z0-9+!*(),;?&=.-]+(:[a-z0-9+!*(),;?&=.-]+)?@)?([a-z0-9\-\.]*)\.(([a-z]{2,4})|([0-9]{1,3}\.([0-9]{1,3})\.([0-9]{1,3})))(:[0-9]{2,5})?(\/([a-z0-9+%-]\.?)+)*\/?(\?[a-z+&$_.-][a-z0-9;:@&%=+/.-]*)?(#[a-z_.-][a-z0-9+$%_.-]*)?


Тесты здесь

.
Ответ написан
Комментировать
@dmitryKovalskiy
программист средней руки
Не знаю какая у вас бизнес-задача, но я бы реализовал примерно так - последовательно перебирал элементы списка и проверял на наличие в массиве уникальных. если элемент есть - идем дальше, если нету - добавляем. Проблема в том что при больших объемах данных такой алгоритм сильно тормозит. на поздних итерациях поисковые операции будут занимать много времени. Это решаемо конечно, но уже более сложными алгоритмами построения массива уникальных записей.
Как вариант - сделать через LINQ - GroupBy по тексту.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы