Действительно ли возможно получить отличные элементы a List
на основе свойства объектов в List
?
Someting как: Distinct(x => x.id)
То, что не полезно для меня, следует: .Select(x => x.id).Distinct()
потому что затем я возвратил бы a List<int>
вместо List<MyClass>
Вам нужен отличительный. Это не часть стандартных библиотек .NET, но Jon Skeet выполнила реализацию его для Linq к объектам здесь . Он также включен в Morelinq .
Это звучит как построение группировки для меня, потому что вам нужно решить, какой из предположительно идентичного объекта вы фактически хотите вернуть
var q = from x in foo
group x by x.Id into g
select g.First(); // or some other selection from g
только потому, что идентификатор идентичен нескольким пунктам, не означает, что элементы идентичны на других Свойства, поэтому вам нужно явно решить, какой элемент возвращается.
Что вы можете сделать, это реализовать свой собственный IEQUATIONATOMPARER
и пропустите, чтобы отчетливо
:
class SomeType {
public int id { get; set; }
// other properties
}
class EqualityComparer : IEqualityComparer<SomeType> {
public bool Equals(SomeType x, SomeType y) {
return x.id == y.id;
}
public int GetHashCode(SomeType obj) {
return obj.id.GetHashCode();
}
}
затем:
// elements is IEnumerable<SomeType>
var distinct = elements.Distinct(new EqualityComparer());
// distinct is IEnumerable<SomeType> and contains distinct items from elements
// as per EqualityComparer
На Enumerable.Distinct()
имеется перегрузка, которая принимает IEqualityComparer
.
Вот пример, где я использовал его для фильтрации целых чисел по четности:
class IntParitiyComparer : IEqualityComparer<int>
{
public bool Equals(int x, int y)
{
return x % 2 == y % 2;
}
public int GetHashCode(int obj)
{
return obj % 2;
}
}
static void Main(string[] args)
{
var x = new int[] { 1, 2, 3, 4 }.Distinct(new IntParitiyComparer());
foreach (var y in x) Console.WriteLine(y);
}
Он неуклюжий; DistinctBy
был бы чище.