#c_sharp #list
/кошка/1 /кошка/2 /собака/1 /собака/2 /тигр/1 Как сделать чтобы в результирующем списке были только те элементы, у которых значения между /*/ уникальные. результат /кошка/1 /собака/1 /тигр/1 Есть вариант заюзать Distinct, но он работает по полному соответсвию. Listlist = 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())
Комментариев нет:
Отправить комментарий