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

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

  1. Зайдите в «Окно»> «Показать представление»> «Другое»

    enter image description here

  2. , найдите servers, выберите его и нажмите OK

    enter image description here

Затем он будет добавлен на ваши вкладки

33
задан Joe Phillips 29 March 2012 в 17:26
поделиться

7 ответов

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

partnerService.SelectPartners().GroupBy(p => p.Name).Select(g => g.First());
76
ответ дан 27 November 2019 в 17:35
поделиться
var distinctCompanies = Companies
  .GroupBy(c => c.CompanyName)
  .Select(g => g.First());
17
ответ дан 27 November 2019 в 17:35
поделиться

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

3
ответ дан 27 November 2019 в 17:35
поделиться

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

    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();
    }

}
2
ответ дан 27 November 2019 в 17:35
поделиться

Если вы не укажете параметр 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();
1
ответ дан 27 November 2019 в 17:35
поделиться

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);
        });
      }
}
1
ответ дан 27 November 2019 в 17:35
поделиться

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

(extension) IQueryable<T> IQueryable<T>.Distinct( IEqualityComparer<T> comparer )
0
ответ дан 27 November 2019 в 17:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: