c# - 根据动态键获取重复数据

标签 c# linq

我有一个 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/

相关文章:

c# - 在 Server 2008 x64 上安装 VB6 运行时

c# - Linq Select Query 或 For Loop 哪种方式更好地搜索通用列表中的内容?

c# - 用于将 .net Web 服务反序列化为 DateTime() 的 Java JSONObject

c# - ManualResetEventSlim : Calling . Set() 后跟 .Reset() 不会释放 *任何* 等待线程

c# - 检测重复插入

c# - 从列表元素创建对象

c# - 将我的 SQL 查询转换为 c# linq/lambda。多参数GroupBy

c# - 尝试使用 linq 查询同一文件夹中的多个文本文件

linq - 将 LINQ 表达式谓词从一种类型更改为另一种类型

c# - 从列表中删除项目的最佳方法