2009-12-18 4 views
2

Примечание: этот вопрос аналогичен this one за исключением того, что я не работаю с linq-to-sql, поэтому «let» не подходит.LINQ отличается от элемента?

В принципе у меня есть выбор типа

... .Select(c => new SampleClass { Id = c.Location.Name, Name = c.Location.Name }).Distinct().ToList() 

, который используется для работы, когда я только что

... .Select(c => c.Location.Name).Distinct().ToList() 

Как бы я сделать отчетливый звонок на один из пунктов в пределах SampleClass?

+0

«let» можно использовать в Linq для объектов тоже ... –

ответ

3

Вы можете группировать элементы по ключу, а затем выбрать, какой элемент выбрать из группы, которую вы хотите использовать. Я использую FirstOrDefault в качестве примера:

... .Select(c => new SampleClass { Id = c.Location.Name, Name = c.Location.Name }) 
    .GroupBy(c => c.Id) 
    .Select(group => group.FirstOrDefault()) 
    .ToList() 
+0

Исправление: мне нужно было бы сделать .GroupBy (c => c.Id) – Rio

+0

О, я думал, вам нужно 'c.Location.Name' из-за второй выборки кода в вашем вопросе. Во всяком случае, я буду обновлять соответственно –

+0

Почему 'Id' и' Name' оба установлены в 'c.Location.Name'? –

1

это то, что вам нужно: http://sprokhorenko.blogspot.com/2009/11/convenient-distinct.html?

Это расширение для IEnumerable, которое позволяет использовать .Distinct() для любого поля (или даже нескольких из них с использованием lambdas), которое создает IEqualityComparer для вас на лету.

+0

Я почти проголосовал за внешнюю ссылку (я ненавижу, чтобы найти вопрос с ответом, а затем не иметь возможности следить за ссылками), но поскольку эта ссылка действительно Awesome, я не проголосовал. – Dementic

+1

Хорошо, я буду помнить об этом в будущем. Спасибо за добрые слова, я рад, что мой блог был полезен для кого-то. Возможно, пришло время продолжать писать ;-) – queen3

+1

Подход, описанный в связанном сообщении, - это то, что я также предпочитаю. Интересно, почему этот метод расширения не входит в состав готовой коробки, так как он подпрыгивает вам в лицо, когда вам приходится иметь дело с Distinct(). –