Linq, Отличный на основе свойства объекта

Действительно ли возможно получить отличные элементы a List на основе свойства объектов в List?

Someting как: Distinct(x => x.id)

То, что не полезно для меня, следует: .Select(x => x.id).Distinct() потому что затем я возвратил бы a List<int> вместо List<MyClass>

8
задан Jay Bazuzi 17 January 2010 в 20:49
поделиться

4 ответа

Вам нужен отличительный. Это не часть стандартных библиотек .NET, но Jon Skeet выполнила реализацию его для Linq к объектам здесь . Он также включен в Morelinq .

2
ответ дан 5 December 2019 в 11:25
поделиться

Это звучит как построение группировки для меня, потому что вам нужно решить, какой из предположительно идентичного объекта вы фактически хотите вернуть

var q = from x in foo
        group x by x.Id into g
        select g.First(); // or some other selection from g

только потому, что идентификатор идентичен нескольким пунктам, не означает, что элементы идентичны на других Свойства, поэтому вам нужно явно решить, какой элемент возвращается.

6
ответ дан 5 December 2019 в 11:25
поделиться

Что вы можете сделать, это реализовать свой собственный 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
5
ответ дан 5 December 2019 в 11:25
поделиться

На 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 был бы чище.

2
ответ дан 5 December 2019 в 11:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: