2013-02-28 27 views
1

唯一對象我有一個Person類:獲得使用LINQ

Public Class Person 
{ 
public string Name {get; set;} 
public string Id {get; set;} 
} 

Public EqualityOnPerson : IEqualityComparer<Person> 
{ 
public bool Equals(PersonData x, PersonData y) 
    { 
     return x.Id == y.Id; 
    } 

    public int GetHashCode(Person obj) 
    { 
     return obj.Id.GetHashCode(); 
    } 

} 

我的人的列表與重複的ID對象是:

Person.Name = "ABC" 
Person.Id = "123" 

Person.Name = "CBA" 
Person.Id = "123" 

Person.Name = "DEF" 
Person.Id = "456" 

Person.Name = "GHI" 
Person.Id = "789" 

Person.Name = "JKL" 
Person.Id = "789" 

Person.Name = "MNO" 
Person.Id = "789" 

Person.Name = "PQR" 
Person.Id = "101" 

Person.Name = "STU" 
Person.Id = "102" 

使用不同會給

Person.Name = "CBA" 
Person.Id = "123" 

Person.Name = "DEF" 
Person.Id = "456" 

Person.Name = "GHI" 
Person.Id = "789" 

Person.Name = "PQR" 
Person.Id = "101" 

Person.Name = "STU" 
Person.Id = "102" 

我如何得到這個

Person.Name = "DEF" 
Person.Id = "456" 

Person.Name = "PQR" 
Person.Id = "101" 

Person.Name = "STU" 
Person.Id = "102" 

只有那些不重複的人物。

問候。

回答

2

您需要組使用相等比較的人,然後選擇從羣體的人只有一個人:

var unduplicatedPersons = persons 
    .GroupBy(p => p, new EqualityOnPerson()) 
    .Where(g => g.Count() == 1) 
    .Select(g => g.Key); 

這裏的,如果需要可以有輕微的性能優勢專用的擴展方法(只是爲了好玩):

public IEnumerable<T> DistinctOnly<T>(this IEnumerable<T> source, 
             IEqualityComparer<T> comparer) 
{ 
    HashSet<T> all = new HashSet<T>(comparer); 
    HashSet<T> distinct = new HashSet<T>(comparer); 
    foreach (T t in source) 
    { 
     if (all.Add(t)) 
      distinct.Add(t); 
     else 
      distinct.Remove(t); 
    } 
    return distinct; 
} 
+0

謝謝。這工作:) – Codehelp 2013-02-28 10:24:51

0
var result = persons.Where(outer => 
    persons.Count(inner => inner.Id == outer.Id) < 2) 

這樣你就不會需要一個相等比較。

+0

雖然它不是很有效,如果你想避免使用相等比較器,你總是可以使用'GroupBy'和選擇器的ID。 – Rawling 2013-02-28 10:24:00

+0

@Rawling是的,你說的是效率,但在我看來,這個選項比分組和計算組中的元素要清楚一些。如果最初的名單不是很大(但這只是我的一個猜測),性能不會成爲問題。 – TKharaishvili 2013-02-28 10:43:29