Создание отдельного списка настраиваемого типа в C #

Я получаю список типов сущностей en entity и хочу возвращать только отдельные значения из списка. Я использую следующий подход, однако это не является уникальным списком. Какие-либо предложения?

Параметр: List flags

 List distinctFlags = flags.Distinct().ToList(); 

Значения флага следующие: ID, Flag, FlagValue. Могу ли я использовать linq в этом экземпляре?

Благодарю.

Предполагая, что Flag является одной из ваших моделей сущностей, вы можете использовать partial class и переопределить Equals и GetHashCode . Это также предполагает, что у вас есть свойство Id в вашем class Flag которое однозначно идентифицирует его.

 //this namespace MUST match the namespace of your entity model. namespace Your.Entity.Model.Namespace { public partial class Flag { public override bool Equals(object obj) { var item = obj as Flag; if (item == null) { return false; } return this.Id.Equals(item.Id); } public override int GetHashCode() { return this.Id.GetHashCode(); } } } 

Использование будет выглядеть так

 List distinctFlags = allFlags.Distinct().ToList(); 

Вероятно, flags – это список ссылочных типов, и отдельные не работают так, как вы ожидаете! Это потому, что Distinct () работает не на значении флага в списке, а на его ссылках на память (все они разные).

Вы должны написать class сравнения, который учит отличать, как сравнивать равный флаг. Предположим, что у вас есть этот class флага:

 public class flag { public string Name { get; set; } public string Code { get; set; } } 

вы должны создать class сравнения следующим образом:

 class FlagComparer : IEqualityComparer { // Products are equal if their names and product numbers are equal. public bool Equals(flag x, flag y) { //Check whether the compared objects reference the same data. if (Object.ReferenceEquals(x, y)) return true; //Check whether any of the compared objects is null. if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) return false; //Check whether the products' properties are equal. return x.Code == y.Code && x.Name == y.Name; } } 

и вызов вашего заявления:

 List distinctFlags = flags.Distinct(new FlagComparer ()).ToList(); 

Таким образом, Distinct метод точно знает, как сравнивать equals flag istance.

ОБНОВИТЬ

Основываясь на вашем комментарии, если вы хотите следовать моему предложению, вы должны написать базу сравнения следующим образом:

 class FlagComparer : IEqualityComparer { // Products are equal if their names and product numbers are equal. public bool Equals(flag x, flag y) { //Check whether the compared objects reference the same data. if (Object.ReferenceEquals(x, y)) return true; //Check whether any of the compared objects is null. if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) return false; //Check whether the products' properties are equal. return x.HostID == y.HostID && x.RuleID == y.RuleID && x.Flag == y.Flag && x.FlagValue == y.FlagValue; } } 

Конечно, каждое свойство должно быть типом значений.

Взгляните сюда, чтобы уточнить:

  • Тип значения
  • Тип ссылки
  • Как бы вы выполняли запрос «не в» с LINQ?
  • LEFT JOIN в LINQ для объектов?
  • Linq to Entities соединяются с groupjoin
  • «Лямбда-выражение с телом оператора не может быть преобразовано в дерево выражений»
  • Как объединить список списков с одинаковыми типами элементов в один список элементов?
  • Оберните делегата в IEqualityComparer
  • String.Equals () не работает по назначению
  • Множественный «порядок по» в LINQ
  • Поиск дерева с помощью LINQ
  • Найти элемент в списке по LINQ?
  • Понимание .AsEnumerable () в LINQ to SQL
  • Давайте будем гением компьютера.