我有一个对象数组,我想根据名称属性从数组中找到两个对象组合的所有可能的“集合”,并且匹配的条件是相同或相似的名称 例如,给定数组:
[{Id:1, Name: audi}, {Id:2, Name: BMW}, {Id:3, Name: audi}, {Id:4, Name: benz}, {Id:5, Name: audiq5},{Id:6, Name: BMWx5}]
我想要的结果是以下集合或表示集合的类似方法:
[{Id:1, Name: audi},{Id:3, Name: audi}]
[{Id:1, Name: audi},{Id:5, Name: audiq5}]
[{Id:3, Name: audi},{Id:5, Name: audiq5}]
[{Id:2, Name: BMW},{Id:6, Name: BMWx5}]
有没有什么算法可以帮助我实现这一目标
答案 0 :(得分:1)
让我们将数据表示为一个名为“ TestModel”的类,并包括一些用于“相似”比较的奖励逻辑(对给定的模糊要求做出一些假设),以及人类可读的字符串表示的便利性: / p>
internal class TestModel
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsSimilar(TestModel other)
{
string myName = Name.ToLower();
string otherName = other.Name.ToLower();
return myName == otherName
|| myName.Contains(otherName)
|| otherName.Contains(myName);
}
public override string ToString()
{
return $"{{Id: {Id}, Name: {Name}}}";
}
}
另外,让我们在某处有一个方法来处理“相似”对的迭代和构造(这里使用元组作为对,因为它们很方便):
private static IEnumerable<Tuple<TestModel, TestModel>> FindSimilarModelPairs(TestModel[] models)
{
for(int i=0; i < models.Length; ++i)
{
TestModel model = models[i];
// Skip the items already processed in the parent loop, to avoid duplicate pairs - if the sequence of two "similar" pairs is important, then the skip should not be done.
foreach(TestModel innerModel in models.Skip(i+1).Where(m => model.IsSimilar(m)))
{
yield return new Tuple<TestModel, TestModel>(model, innerModel);
}
}
}
现在使用,假设是一个简单的控制台应用程序的上下文:
TestModel[] list = new[]
{
new TestModel{ Id=1, Name="audi"},
new TestModel{ Id=2, Name="BMW"},
new TestModel{ Id=3, Name="audi"},
new TestModel{ Id=4, Name="benz"},
new TestModel{ Id=5, Name="audiq5"},
new TestModel{ Id=6, Name="BMWx5"},
};
foreach(var match in FindSimilarModelPairs(list))
{
Console.WriteLine($"[{match.Item1.ToString()},{match.Item2.ToString()}");
}
Console.WriteLine("Press 'Enter'");
Console.ReadLine();
答案 1 :(得分:0)
使用嵌套循环遍历集合,以将每个对象彼此进行比较
类似:
List <Array> Agrigrate = new List<Array>();
foreach (foo i in bar)
{
foreach(foo j in bar)
{
if(i.ID != j.ID && i.Name.Contains(j.Name))
{
Agrigrate.Add(new Array[i, j]);
}
}
}
这只是一个基本示例,但足以让您了解这些事情通常是如何完成的