Страницы

Поиск по вопросам

среда, 29 января 2020 г.

List<string> взять уникальные значение

#c_sharp #list


/кошка/1
/кошка/2
/собака/1
/собака/2
/тигр/1 


Как сделать чтобы в результирующем списке были только те элементы, у которых значения
между /*/ уникальные. 
результат

/кошка/1
/собака/1
/тигр/1


Есть вариант заюзать Distinct, но он работает по полному соответсвию.

List list = new List();
    list.Add(1);
    list.Add(2);
    list.Add(3);
    list.Add(3);
    list.Add(4);
    list.Add(4);
    list.Add(4);
List distinct = list.Distinct().ToList();


А как сделать чтобы он брал значение между /*/ и выбрал среди них уникальные. Мне
кажется надо использовать lambda выражения. 
    


Ответы

Ответ 1



в Distinct можно передать свой "сравниватель на одинаковость" - IEqualityComparer: class PartialComparer : IEqualityComparer { public string GetComparablePart(string s) { return s.Split('/')[1]; } public bool Equals(string x, string y) { return GetComparablePart(x).Equals(GetComparablePart(y)); } public int GetHashCode(string obj) { return GetComparablePart(obj).GetHashCode(); } } class Program { static void Main(string[] args) { List list = new List { "/кошка/1", "/кошка/2", "/собака/1", "/собака/2", "/тигр/1" }; // "/кошка/1" // "/собака/1" // "/тигр/1" var result = list.Distinct(new PartialComparer()).ToList(); } }

Ответ 2



Для полноты, вот ещё один метод, короче, но менее эффективно: list.GroupBy(s => s.Split('/')[1]).Select(g => g.First())

Комментариев нет:

Отправить комментарий