Вопрос Linq-запроса: различается в зависимости от свойства объекта - PullRequest
1 голос
/ 09 октября 2010

Я собираю несколько списков в один список и хотел бы сделать его отличным, основываясь на одном из свойств Foo (Foo.Prop1). У меня нет доступа для изменения компаратора равенства Foo.

Dictionary<string, List<Foo>> fooDictionary = new Dictionary<string, List<Foo>>();
List<Foo> foovals = (from e in fooDictionary
                     where e.Key == "foo1" || e.Key == "foo2" || e.Key == "foo3"
                     select e.Value).SelectMany(f => f).ToList();

единственное, чего здесь не хватает, это .Distinct () в конце, чтобы сделать Foo уникальным, однако, в моем случае, я ничего не могу изменить в Foo, поэтому просто вызываю Distinct ()не будет работать.

Есть ли способ изменить этот запрос, чтобы он возвращал элементы Distinct на основе Foo.Prop1?

Ответы [ 3 ]

3 голосов
/ 09 октября 2010

Вы можете передать пользовательский сравнитель равенства в Distinct():

.SelectMany().Distinct(new FooEqualityComparer());

В новом файле "FooEqualityComparer.cs":

public class FooEqualityComparer : IEqualityComparer<Foo>
{
    public bool Equals(Foo x, Foo y)
    {
        return Equals(x.Prop1, y.Prop1);
    }

    public int GetHashCode(Foo x)
    {
        return x.Prop1.GetHashCode();
    }
}
2 голосов
/ 09 октября 2010

Вы можете использовать метод DistinctBy в MoreLINQ :

var query = fooVals.DistinctBy(foo => foo.Property1);
0 голосов
/ 09 октября 2010
var tempKeys = new HashSet<int>();    // change int to the actual type of Prop1

List<Foo> foovals = (from e in fooDictionary
                     where e.Key == "foo1" || e.Key == "foo2" || e.Key == "foo3"
                     select e.Value).SelectMany(f => f)
                                    .Where(f => tempKeys.Add(f.Prop1))
                                    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...