Подтвердить что ты не робот

Удалить объекты с дублирующимся свойством из списка

У меня есть список объектов в С#. Все объекты содержат идентификатор свойства. Есть несколько объектов, которые имеют одинаковое свойство ID.

Как я могу обрезать список (или создать новый список), где есть только один объект для свойства ID?

[Любые дополнительные дубликаты исключаются из списка]

4b9b3361

Ответ 1

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

fooArray.GroupBy(x => x.Id).Select(x => x.First());

Это будет группировать массив по свойству Id, а затем выбрать первую запись в группировке.

Ответ 2

MoreLINQ DistinctBy() выполнит эту работу, это позволит использовать функцию объекта для отличимости. Несчастливо построено в LINQ Distinct() не гибкое enoght.

var uniqueItems = allItems.DistinctBy(i => i.Id);

DistinctBy()

Возвращает все отдельные элементы данного источника, где "отличимость" определяется через проекцию и стандартную эвакуативность компаратор для прогнозируемого типа.

PS: Кредиты на Jon Skeet для обмена этой библиотекой с сообществом

Ответ 3

var list = GetListFromSomeWhere();
var list2 = GetListFromSomeWhere();
list.AddRange(list2);

....
...
var distinctedList = list.DistinctBy(x => x.ID).ToList();

More LINQ в код google

Или, если вы не хотите использовать внешние dll по какой-либо причине, вы можете использовать эту перегрузку Distinct:

public static IEnumerable<TSource> Distinct<TSource>(
    this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)

Использование:

public class FooComparer : IEqualityComparer<Foo>
{
    // Products are equal if their names and product numbers are equal.
    public bool Equals(Foo x, Foo y)
    {

        //Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether any of the compared objects is null.
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        return x.ID == y.ID
    }
}



list.Distinct(new FooComparer());

Ответ 4

Не уверен, что кто-то еще ищет какие-либо дополнительные способы сделать это. Но я использовал этот код для удаления дубликатов из списка объектов User на основе совпадающих идентификационных номеров.

    private ArrayList RemoveSearchDuplicates(ArrayList SearchResults)
    {
        ArrayList TempList = new ArrayList();

        foreach (User u1 in SearchResults)
        {
            bool duplicatefound = false;
            foreach (User u2 in TempList)
                if (u1.ID == u2.ID)
                    duplicatefound = true;

            if (!duplicatefound)
                TempList.Add(u1);
        }
        return TempList;
    }

Вызов: SearchResults = УдалитьSearchDuplicates (SearchResults);