2012-03-07 9 views
10

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

Param: List<Flag> flags

List<Flag> distinctFlags = flags.Distinct().ToList(); 

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

Спасибо.

+0

Каковы ваши входные значения и то, что вы ожидаете в качестве выхода? –

+0

Это внутри или снаружи dbcontext? Покажите еще код. И если можете, укажите пример данных до и после преобразования. –

+1

Сгруппируйте их и выберите победителя. http://stackoverflow.com/questions/489258/linq-distinct-on-a-particular-property/491832#491832 –

ответ

14

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

//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<Flag> distinctFlags = allFlags.Distinct().ToList(); 
+1

Вы должны также реализовать 'IEquatable ' от типа. – svick

+0

И, вероятно, переопределить '==' и '! =' –

+0

Вам нужно только реализовать 'Equals' &' GetHashCode'. Просто убедитесь, что значение хэш-кода никогда не изменяется - значение ДОЛЖНО быть IMMUTABLE. – Enigmativity

1

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

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

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

вы должны создать класс компаратором, как это:

class FlagComparer : IEqualityComparer<flag> 
{ 
    // 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 метод знаю точно, как сравнивать равный флаг.

UPDATE

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

class FlagComparer : IEqualityComparer<flag> 
    { 
     // 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; 
     } 
    } 

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

Посмотрите здесь, чтобы разъяснить себе:

+1

Это будет работать, но переопределение «Equals()» и реализация «IEquatable » - более общий подход, потому что это означает, что вам не нужно указывать компаратор каждый раз. – svick

Смежные вопросы