Выберите Distinct в Linq с анонимным типом - PullRequest
1 голос
/ 09 ноября 2010

Рассмотрим этот запрос LINQ. Это приводит к ошибке, когда заданный blobID.Key появляется больше чем один.

Есть ли способ добавить отличительные здесь, чтобы преобразовать его в словарь безопасным способом?

var temp = (from blobID in blobIds
            join blob in blobs on blobID.Value.HashKey 
            equals blob.HashKey
            select new { blobID.Key,  
                          Binder = Load(blob)}
           ).ToDictionary(arg => arg.Key, arg => arg.Binder);

Ответы [ 3 ]

2 голосов
/ 09 ноября 2010

Object.Equals переопределяется для анонимных классов, поэтому вы можете просто использовать Enumerable.Distinct:

var temp = (from blobID in blobIds
            join blob in blobs on blobID.Value.HashKey equals blob.HashKey
            select new {
                blobID.Key,
                Binder = Load(blob)
            }
           ).Distinct()
            .ToDictionary(arg => arg.Key, arg => arg.Binder);

Здесь Distinct будет использовать Default средство сравнения равенства для анонимного класса. Default средство сравнения равенства для анонимного класса использует Object.Equals, которое переопределяется, чтобы возвращать значение true, если все свойства равны.

1 голос
/ 09 ноября 2010

Используйте ToLookup. Это было сделано для этого.

0 голосов
/ 09 ноября 2010

Да, это было бы проблемой со словарем, так как ключ должен быть уникальным.Вы можете рассмотреть возможность использования другой структуры для хранения данных (списка), которая не имеет этого требования, или вы можете попробовать Distinct (), как упомянуто @Jason, или потенциально сгруппировать по ключу, и создать словарь группы.Таким образом, ключ является уникальным, и вы храните коллекцию всех записей с данным ключом.

Зависит от ваших требований.

HTH.

...