Ответ 1
Если вы хотите избежать использования сторонней библиотеки, вы можете сделать что-то вроде:
fooArray.GroupBy(x => x.Id).Select(x => x.First());
Это будет группировать массив по свойству Id, а затем выбрать первую запись в группировке.
У меня есть список объектов в С#. Все объекты содержат идентификатор свойства. Есть несколько объектов, которые имеют одинаковое свойство ID.
Как я могу обрезать список (или создать новый список), где есть только один объект для свойства ID?
[Любые дополнительные дубликаты исключаются из списка]
Если вы хотите избежать использования сторонней библиотеки, вы можете сделать что-то вроде:
fooArray.GroupBy(x => x.Id).Select(x => x.First());
Это будет группировать массив по свойству Id, а затем выбрать первую запись в группировке.
MoreLINQ DistinctBy()
выполнит эту работу, это позволит использовать функцию объекта для отличимости. Несчастливо построено в LINQ Distinct()
не гибкое enoght.
var uniqueItems = allItems.DistinctBy(i => i.Id);
DistinctBy()
Возвращает все отдельные элементы данного источника, где "отличимость" определяется через проекцию и стандартную эвакуативность компаратор для прогнозируемого типа.
PS: Кредиты на Jon Skeet для обмена этой библиотекой с сообществом
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());
Не уверен, что кто-то еще ищет какие-либо дополнительные способы сделать это. Но я использовал этот код для удаления дубликатов из списка объектов 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);