查找相关对象

时间:2018-09-27 17:04:28

标签: c#

我有一个对象数组,我想根据名称属性从数组中找到两个对象组合的所有可能的“集合”,并且匹配的条件是相同或相似的名称 例如,给定数组:

[{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}]

有没有什么算法可以帮助我实现这一目标

2 个答案:

答案 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]);
            }
        }
    }

这只是一个基本示例,但足以让您了解这些事情通常是如何完成的