我有一个 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";
如何编写查询以添加该功能?
问候。
最佳答案
您可以使用反射来实现:
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"
。
关于c# - 根据动态键获取重复数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15217566/