Как удалить один из двух элементов списка <object>на основе свойства объекта? - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть список, в котором есть элементы, которые похожи, но имеют разные createdOn даты.Я хочу сохранить элементы с тем же displayName, но с самой последней датой createdOn.Я создал предикат для сравнения элементов списка на основе displayName, поэтому я могу определить, есть ли у меня элемент с таким же displayName, но я не уверен, как мне найти другой элемент с более старой датой createdOn иудалите его.

Предикат

public bool Equals(Obj x, Obj y)
        {
            if (x == null && y == null) { return true; }
            if (x == null || y == null) { return false; }

            return x.DisplayName == y.DisplayName;
        }

        public int GetHashCode(Obj obj)
        {
            if (obj == null || obj.DisplayName == null) { return 0; }
            return obj.DisplayName.GetHashCode();
        }

Метод RemoveDuplicateMethod:

public static List<Obj> RemoveDuplicatesSet(List<Obj> items, ValueComparer valueComparer)
    {
        // Use HashSet to maintain table of duplicates encountered.
        var result = new List<Obj>();
        var set = new HashSet<Obj>(valueComparer);
        for (int i = 0; i < items.Count; i++)
        {
            // If not duplicate, add to result.
            if (!set.Contains(items[i]))
            {
                result.Add(items[i]);
                // Record as a future duplicate.
                set.Add(items[i]);
            }
        }
        return result;
    }

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Я не знаю данных, которые у вас есть, но попробуйте использовать LINQ.

var dItems = items.Distinct();

А если вам нужны только последние, используйте лямбда-выражение.

var dItems = items.OrderByDescending(x => x.createdOn).Distinct();
0 голосов
/ 27 ноября 2018

Ну, я бы использовал это следующим образом:

List<Obj> items = items
    .GroupBy(x => x.Id) // or DisplayName, question is unclear
    .Select(g => g.OrderByDescending(x => x.CreatedOn).First())
    .ToList();

Вы также можете передать свой компаратор на GroupBy, хотя я не знаю ValueComparer, если он реализует IEqualityComparer<Obj>это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...