2012-09-17 25 views
2

我有一個包含來自類的對象的列表。包含各種項目的類,包括int和double數組。這個類看起來像這樣。從包含具有數組元素的類的列表中刪除重複的項目

public class NewChildren 
{ 
    public double[] fitnessValue{get;set;} 

    public int[] locationScheme{get;set;} 

    public double crowdingDistance{get;set;} 
} 

由於列表可能包含重複的項目,我有興趣將其刪除。在網絡上,我看到了一些基於Linq的解決方案,它們使用Distinct()和GroupBy()方法。但是,似乎這些方法不會像對象中存在數組那樣工作(MSVS2008不會給出任何錯誤,但是也不會刪除任何項目)。

任何建議(包括引用或代碼)是高度讚賞。提前致謝。

回答

1

的問題你必須問自己,當的NewChildren兩個實例都是一樣的嗎?既然你有名單,這可能不是一個容易回答的問題。當你已經確定這一點,你必須在你的類實現平等方法:

public class NewChildren 
{ 
    public double[] fitnessValue{get;set;} 

    public int[] locationScheme{get;set;} 

    public double crowdingDistance{get;set;} 

    public bool override Equals(object other) 
    { 
     // ... implement your rules for equality here 
    } 
} 

現在,爲了做到這一點,你必須始終遵守Microsoft guidelines。凌駕平等不是很簡單,雖然它並不複雜。舉個例子,當你有相同的元素的所有陣列:

public bool override Equals(object other) 
{ 
    if (other == null || !(other is NewChildren)) 
    { 
     return false; 
    } 

    var another = (NewChildren)other; 

    return AreEquivalent(this.fitnessValue, another.fitnessValue) 
     && AreEquivalent(this.locationScheme, another.locationScheme) 
     && AreEquivalent(this.crowdingDistance, another.crowdingDistance); 

} 

public static bool AreEquivalent<T>(T[] a, T[] b) 
{ 
    return a1.OrderBy(a => a).SequenceEqual(a2.OrderBy(a => a)); 
} 

陣列平等的實現是從here拍攝。您可以使用this reference進行優化。

+0

謝謝。您編寫Equals方法的簡單示例使我朝着正確的方向並解決了我的問題。 – Ehsan

+0

@Ehsan,沒問題!我在這裏幫忙。只要不要忘記遵循Microsoft的指導原則並重寫'GetHashCode'。你也可能想重寫'operator =='(只是委託給Equals)。 –

1

docs所述,默認情況下,Distinct使用默認的相等比較器。該默認的相等比較器將列表中的每個項目識別爲與所有其他項目不同,因爲它會檢查實例標識。

像你希望在上述文件指出,爲了比較的自定義類型和定義平等,你將需要實現你的類中的一些比較相關的方法:

比較自定義數據類型,您需要實施[IEquatable<T>]並提供您自己的GetHashCodeEquals這種類型的方法。

+1

感謝您的參考。 – Ehsan

相關問題