2013-03-05 114 views
3

獲得重複數據我有Person對象的列表:基於動態密鑰

List<PersonData> AllPersons 

從這個名單我想一切都基於一定的屬性重複這些人的對象。

例如,此代碼給基於ID

var duplicateKeys = AllPersons.GroupBy(p => p.Id).Select(g => new { g.Key, Count = g.Count() }).Where(x => x.Count > 1).ToList().Select(d => d.Key); 
    duplicates = AllPersons.Where(p => duplicateKeys.Contains(p.Id)).ToList(); 

部分p.Id可以是動態的所有重複?

這意味着如果用戶指定的唯一的列在配置文件中,它的讀取,像這樣:

string uniqueColumn = "FirstName"; 

如何查詢組成,以增加該功能?

問候。

+0

什麼'AllCompanies'是什麼? – MarcinJuraszek 2013-03-05 06:57:59

+0

更正了錯字。 – Codehelp 2013-03-05 07:00:00

回答

1

您可以使用反射來實現這一目標:

List<PersonData> AllPersons = new List<PersonData>() 
{ 
    new PersonData { Id = 1, FirstName = "Tom" }, 
    new PersonData { Id = 2, FirstName = "Jon" }, 
    new PersonData { Id = 3, FirstName = "Tom" } 
}; 

string uniqueColumn = "FirstName"; 

var prop = typeof(PersonData).GetProperty(uniqueColumn); 

var duplicateKeys = AllPersons.GroupBy(p => prop.GetValue(p, null)) 
           .Select(g => new { g.Key, Count = g.Count() }) 
           .Where(x => x.Count > 1) 
           .Select(d => d.Key) 
           .ToList(); 

var duplicates = AllPersons.Where(p => duplicateKeys.Contains(prop.GetValue(p, null))).ToList(); 

duplicates有2個元素FirstName == "Tom"查詢執行後。

+0

P => prop.GetValue(丙,空)給出「對象不匹配目標類型」錯誤。任何想法? – Codehelp 2013-03-05 07:15:07

+0

更新了我的回答,對於那個錯誤感到抱歉。 – MarcinJuraszek 2013-03-05 07:15:43

+0

哇。簡直太神奇了。你讓我今天一整天都感覺很好。感謝Marcin的幫助,並感謝您的耐心。 – Codehelp 2013-03-05 07:18:38