2011-11-29 90 views
18

所以我知道如何通過使用Linq中的Distinct()來刪除列表中的重複項,以及字符串和整型等。但是,如何根據對象的特定屬性刪除重複項?刪除列表中的重複對象(C#)

例如,我有一個TimeMetric類。這個TimeMetric類有兩個屬性:MetricTextMetricTime。我有一個TimeMetrics名爲MetricList的清單。我想刪除具有相同MetricText屬性的任何重複項TimeMetricTimeMetric的值可以相同,但如果有任何TimeMetric具有相同的MetricText,它必須是不重複的。

回答

21

您需要使用Distinct的第二個重載,它將IEqualityComparer<TimeMetric>實例作爲第二個參數。定義一個比較器是這樣的:

class MyComparer : IEqualityComparer<TimeMetric> 
{ 
    public bool Equals(TimeMetric x, TimeMetric y) 
    { 
     return x.MetricText.Equals(y.MetricText); 
    } 

    public int GetHashCode(TimeMetric obj) 
    { 
     return obj.MetricText.GetHashCode(); 
    } 
} 

重要提示:上面的代碼不檢查的情況下MetricText屬性是null(這聽起來像它可能是,因爲它是最有可能一個string)。如果MetricTextnull,則應該這樣做並從GetHashCode返回0。另一方面,如果MetricText的類型是值類型,則不需要執行任何修改。

然後:

var list = new List<TimeMetric> { ... }; 
var unique = list.Distinct(new MyComparer()); 
3

可以使用Distinct overloadIEqualityComparer

你對於自己的IEqualityComparer實現equals方法是這樣的:

bool Equals(TimeMetric x, TimeMetric y) 
{ 
    return x.MetricText.Equals(y.MetricText); 
} 
+1

這是不正確的,並且只會在MetricText的類型爲'string'(或者覆蓋'operator ==' )。應該使用「Equals」。 – Jon

+0

我認爲這是一個字符串,這不是一個好的假設,並更新了迴應。 –

14

使用LINQ:

var list = list 
    .GroupBy(i => i.MetricText) 
    .Select(g => g.First()) 
    .ToList(); 

或者通過在使用該屬性一個比較器:

public class mtCompare : IEqualityComparer<TimeMetric> 
{ 
    public bool Equals(TimeMetric x, TimeMetric y) 
    { 
    return Equals(x.MetricText, y.MetricText); 
    } 

    public int GetHashCode(TimeMetric obj) 
    { 
    return obj.MetricText.GetHashCode(); 
    } 
} 

.... 

list.Distinct(new mtCompare());