gpt4 book ai didi

c# - 使用 linq 查找跨多个属性的最佳匹配

转载 作者:太空宇宙 更新时间:2023-11-03 10:27:57 25 4
gpt4 key购买 nike

我正在尝试使用 linq 在一组属性的自定义对象列表中找到最佳匹配。在下面创建的 MyObjects 列表中,我想在 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 个属性的所有对象)

解决方案

根据 Sloths 的回答,我已经能够使用它得到我想要的东西。不过,我很想看看是否有人对此有更简洁的答案......

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

最佳答案

你也可以试试这个

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

//list of objects with 3 or matches
var sorted = list.Select(x => new
{
MatchCount = (x.Property1 == testObject.Property1 ? 1 : 0)
+ (x.Property2 == testObject.Property2 ? 1 : 0)
+ (x.Property3 == testObject.Property3 ? 1 : 0)
+ (x.Property4 == testObject.Property4 ? 1 : 0),
MyObj = x
})
.OrderBy( x => x.MatchCount)
.Where( x => x.MatchCount >= 3 );

//gets the first object from the list
var match = sorted.Any() ? sorted.OrderBy(x => x.MatchCount).FirstOrDefault().MyObj : null;

关于c# - 使用 linq 查找跨多个属性的最佳匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31114892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com