Удалить объекты с двойным свойством из списка - PullRequest
41 голосов
/ 03 апреля 2012

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

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

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

Ответы [ 4 ]

92 голосов
/ 03 апреля 2012

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

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

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

19 голосов
/ 03 апреля 2012

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

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

DistinctBy ()

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

PS: Кредиты Джону Скиту для обмена этой библиотекой с сообществом

5 голосов
/ 10 апреля 2013

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

    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;
    }

Call: SearchResults = RemoveSearchDuplicates (SearchResults);

5 голосов
/ 03 апреля 2012
var list = GetListFromSomeWhere();
var list2 = GetListFromSomeWhere();
list.AddRange(list2);

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

More LINQ при GitHub

Или, если по какой-то причине вы не хотите использовать внешние библиотеки 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...