2013-03-05 196 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