Чтобы Enumerable.Distinct
работали для вашего типа, вы можете реализовать IEquatable
и предоставить подходящие определения для Equals
и GetHashCode
, в противном случае он будет использовать реализацию по умолчанию: сравнение для равенство ссылок (при условии, что вы используете ссылочный тип).
Из руководства:
Метод Distinct (IEnumerable) возвращает неупорядоченную последовательность, которая не содержит повторяющихся значений. Он использует компаратор равенства по умолчанию, Default, для сравнения значений.
Средство сравнения по умолчанию, Default, используется для сравнения значений типов, которые реализуют универсальный интерфейс IEquatable. Чтобы сравнить пользовательский тип данных, вам необходимо реализовать этот интерфейс и предоставить собственные методы GetHashCode и Equals для этого типа.
В вашем случае, похоже, вам просто нужно сравнить идентификаторы, но вы также можете сравнить другие поля в зависимости от того, что для вас означает, что два объекта «одинаковы».
Вы также можете рассмотреть возможность использования DistinctBy
из morelinq .
Обратите внимание, что это только LINQ to Objects, но я предполагаю, что это то, что вы используете.
Еще один вариант - объединить GroupBy
и First
:
var query = // your query here...
.GroupBy(x => x.Id)
.Select(g => g.First());
Это также будет работать, например, в LINQ to SQL.
Я предполагаю, что вы спрашиваете о сохранении троек (и, возможно, графов через квадраты), где хранилище является либо «собственным» хранилищем троек (например, TDB ) или реляционная база данных с наложением тройного хранилища (например, SDB ).
Если вы подробно изложите свои требования, я уверен, что участники Stack Overflow могут предложить более конкретный ответ, но только в первую очередь в моей голове:
Я ' m создатель Redland , который включает собственные тройные хранилища на C, плюс я использовал некоторые системы Java, такие как Jena и Sesame.
Трудно сказать больше, не зная, в чем ваша проблема, но в целом нативные тройные хранилища работают лучше, если ваше проблемное пространство / шаблон запроса более «графичен», чем «объектно». Объектный означает, что вы склонны всегда манипулировать - каждый раз устанавливать / получать один и тот же шаблон данных - в этом случае вы также можете использовать ORM или другое объектно-реляционное сопоставление и фиксированную схему. Если ваша проблема и схема более динамичны - «Graphy» - вы можете извлечь выгоду из подхода с тройным хранилищем, при котором проще перемещаться по данным, чем обычно в мире СУБД (также называемых соединениями).
Конечно, также есть документ-подход тоже такой как CouchDB, но это '