2009-05-26 103 views
33

我想填充製藥公司的下拉列表,如拜耳,混合泳等。而且,我從DB和論文中獲取論文名稱名稱在DB中重複,但使用不同的ID。Linq Distinct()名稱爲填充名稱和值的下拉列表

我想使用Linq Distinct(),但我不想使用相等比較器。有另一種方法嗎?

我的下拉列表中必須填入公司的ID和公司名稱。

我想是這樣的:

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

是表示反覆公司DDL。

謝謝!

+0

如果一家公司多次出現不同的ID並且希望它們只出現一次,應該顯示什麼樣的ID?首先?沒關係? – 2009-05-26 19:17:25

+0

身份證是身份 – AndreMiranda 2009-05-26 19:35:26

回答

76

下面的表達式將只選擇不同的公司和它的ID返回第一次出現。

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

獨特的作品在整個選擇。如果在select中包含c.codPartner,並且對同一個c.name有兩個不同的c.codPartner值,那麼您將看到具有相同c.name的兩行。

0

只是在您自己的比較器中使用其他重載之一傳遞給Distinct方法。

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

它不會改變任何東西......如果有幾個公司具有相同的名稱,但ID不同,您將如何選擇使用的身份證? – 2009-05-26 19:18:53

+0

我同意 - 選擇ID將是一個問題。如果你想爲每個ID分配一個特定的ID,那麼使用EqualityComparer中的一個獨立分支可能不會成爲一種方法。另外,請記住,在這裏downvote原來的問題沒有說明爲不同的結果中的每個項目選擇一個特定的ID ... – 2009-05-26 19:30:31

1

如果您沒有指定IEqualityComparer參數,那麼它只會使用Object.ReferenceEquals,它會查看對象的GetHashKey值。對於匿名類型,它們是唯一的。

現在解決這個問題有點棘手,因爲您無法爲匿名類型編寫IEqualityComparer。所以,你muct創建針對該問題的真正類型:

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(); 
+0

ReferenceEquals不比較哈希碼,它比較引用......只有當兩個引用指向相同的實例 – 2009-05-26 19:20:27

2

我不認爲你可以用匿名類做到這一點,但如果你創建了一個數據對象像

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

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

Distinc將使用GetHashCode的,如果你鴕鳥政策告訴它(通過的IEqualityComparer)至使用另一種方法。 你可以使用一個通用的equalitycomparer,像這樣:

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); 
     }); 
     } 
} 
相關問題