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";

如何组合查询以添加该功能?

问候。

4

2 回答 2

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();

duplicatesFirstName == "Tom"在查询执行后有 2 个元素。

于 2013-03-05T07:03:35.697 回答
0

您可能想查看Dynamic LINQPredicateBuilder

于 2013-03-05T07:03:53.390 回答