Страницы

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

воскресенье, 31 марта 2019 г.

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 выражения.


Ответ

в 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(); } }

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

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