@Xveeder

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

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

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


Задача: нужно удалить из списка вот такие элементы:
https://mysite.com/post/168755988566
И оставить только такие:
https://mysite.com/
  • Вопрос задан
  • 526 просмотров
Решения вопроса 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 по тексту.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Bip.ru Москва
от 150 000 до 250 000 ₽
Альфа-Банк Москва
от 200 000 ₽
Bip.ru Москва
от 250 000 до 350 000 ₽
04 окт. 2024, в 08:53
20000 руб./за проект
04 окт. 2024, в 07:19
1111 руб./за проект
04 окт. 2024, в 06:53
2000 руб./за проект