Подтвердить что ты не робот

Linq Distinct() по имени для заполнения выпадающего списка с именем и значением

Я пытаюсь заполнить раскрывающийся список фармацевтическими компаниями, такими как Bayer, Medley и т.д. И я получаю имена тезисов от DB, а имена тегов повторяются в DB, ​​но с разными идентификаторами.

Я пытаюсь использовать Linq Distinct(), но я не хочу использовать сопоставитель равенства. Есть ли другой способ?

Мой раскрывающийся список должен быть заполнен идентификатором и именем компании.

Я пытаюсь что-то вроде:

var x = _partnerService
           .SelectPartners()
           .Select(c => new {codPartner = c.codPartner, name = c.name})
           .Distinct();

Это показывает повторяющиеся компании в ddl.

спасибо!

4b9b3361

Ответ 1

Следующее выражение выберет только отдельные компании и вернет первое вхождение с его идентификатором.

partnerService.SelectPartners().GroupBy(p => p.Name).Select(g => g.First());

Ответ 2

var distinctCompanies = Companies
  .GroupBy(c => c.CompanyName)
  .Select(g => g.First());

Ответ 3

Отличительная особенность работает во всем выборе. Если вы включите c.codPartner в select, и есть два разных значения c.codPartner для того же c.name, то вы увидите две строки с тем же именем c.name.

Ответ 4

Я не думаю, что вы можете сделать это с помощью анонимного класса, но если вы создали объект данных, например

    class Foo
{
    private int _ID;

    public int ID
    {
        get { return _ID; }
        set { _ID = value; }
    }
    private string _Name;

    public string Name
    {
        get { return _Name; }
        set { _Name = value; }
    }

}

вы можете создать объект-компаратор, например

    class FooComparer : IEqualityComparer<Foo>
{


    public bool Equals(Foo x, Foo y)
    {
        return x.Name == y.Name;
    }

    public int GetHashCode(Foo obj)
    {
        return obj.GetHashCode();
    }

}

Ответ 5

Если вы не укажете параметр IEqualityComparer, тогда он просто будет использовать Object.ReferenceEquals, который будет рассматривать значение объектов GetHashKey. Для анонимных типов они уникальны.

Теперь решение этого немного сложно, поскольку вы не можете написать IEqualityComparer для анонимного типа. Поэтому вы можете создать реальный тип проблемы:

class Partner
{
    public int codPartner {get; set;}
    public string name {get; set;}
    public override int GetHashCode() { return name .GetHashCode();}
}

var x = _partnerService.SelectPartners()
        .Select(c => new Partner {codPartner = c.codPartner, name = c.name})
        .Distinct();

Ответ 6

Distinc будет использовать GetHashCode, если вы не скажете (через IEqualityComparer) использовать другой метод. Вы можете использовать общий принцип равенства, например:

public class GenericEqualityComparer<T> : IEqualityComparer<T>
{    
    private Func<T, T, Boolean> comparer;    

    public GenericEqualityComparer(Func<T, T, Boolean> comparer)    
    {        
        this.comparer = comparer;    
    }    

    #region IEqualityComparer<T> Implementation

    public bool Equals(T x, T y)    
    {        
        return comparer(x, y);    
    }    

    public int GetHashCode(T obj)    
    {
        return obj.GetHashCode();  
    }    

    #endregion
}

а затем используйте это (kindof)

public static IEqualityComparer<YourType> MyComparer
{
   get
     {
      return new GenericEqualityComparer<YourType>((x, y) =>
       {
          return x.name.Equals(y.name);
        });
      }
}

Ответ 7

просто передайте свой собственный сравнитель с методом Distinct, используя одну из других перегрузок.

(extension) IQueryable<T> IQueryable<T>.Distinct( IEqualityComparer<T> comparer )