【发布时间】:2015-09-15 20:52:37
【问题描述】:
我正在尝试使用 linq 在一组属性的自定义对象列表中找到最佳匹配。在下面创建的 MyObject 列表中,我想在 MyObject 的所有四个属性中找到与 testObject 最匹配的一个:
IList<MyObject> list = new List<MyObject>();
list.Add(new MyObject { Property1 = "A", Property2 = "B", Property3 = "C", Property4 = "D" });
list.Add(new MyObject { Property1 = "A", Property2 = "A", Property3 = "C", Property4 = "D" });
list.Add(new MyObject { Property1 = "A", Property2 = "A", Property3 = "A", Property4 = "D" });
var testObject = new MyObject { Property1 = "A", Property2 = "A", Property3 = "A", Property4 = "A" };
在上面的示例中,我希望将最后一个对象匹配为 3 或 4 个属性与 testObject 中的属性匹配。
我可以通过这样做计算出有多少个属性匹配:
var matchCount = list.Max(x => (x.Property1 == testObject.Property1 ? 1 : 0) +
(x.Property2 == testObject.Property2 ? 1 : 0) +
(x.Property3 == testObject.Property3 ? 1 : 0) +
(x.Property4 == testObject.Property4 ? 1 : 0));
但我不知道如何选择与三个属性匹配的实体,除了写出一个非常长的 linq 表达式来检查每个属性组合上的 3 个匹配项。理想情况下,我想要一个能够优雅地适用于具有 10 个属性的对象的解决方案。
有谁知道是否有一种可接受的方式来做到这一点?
编辑
我从原始问题中遗漏的另一条信息...如果匹配的对象超过 1 个,那么我需要选择与该精度级别匹配的对象列表(即,如果有一个对象匹配 3 个属性,那么我需要找到匹配 3 个属性的所有对象)
解决方案
根据树懒的回答,我已经能够使用它得到我想要的东西。不过,我很想看看是否有人对此有更简洁的答案...
var grouping = list.GroupBy(x => (x.Property1 == testObject.Property1 ? 1 : 0) +
(x.Property2 == testObject.Property2 ? 1 : 0) +
(x.Property3 == testObject.Property3 ? 1 : 0) +
(x.Property4 == testObject.Property4 ? 1 : 0));
var maxCount = grouping.Max(x => x.Key);
var resultSet = grouping.FirstOrDefault(x => x.Key == maxCount).Select(g => g).ToList();
【问题讨论】:
标签: c# .net performance linq filtering