首页 > 解决方案 > 如何检查对象的字符串列表中的项目是否也存在于具有相同标识符的不同对象的其他字符串列表中?

问题描述

我有一个清单

var resource = new List<Resource>();

资源看起来像这样

public class Resource
{
    public int RepatedId { get; set; }
    public string Name { get; set; }
    public List<string> Data { get; set; }
}

不同的资源对象可以有相同的RepeatedId

我的主要目标是找到成对的资源对象,其中数据列表中的一个元素存在于同一RepeatedId下的另一个资源对象中。

我按 RepatedId 对资源进行了分组

var grouped = resource.GroupBy(x => x.RepatedId , x => x.Data);

但我不知道如何从第一个资源中的数据中获取第一个元素并遍历其他元素以在不同对象中找到相同的元素。

示例数据:

var resource = new List<Resource>
{
    new Resource
    {
        RepatedId = 1,
        Name = "whatever",
        Data = new List<string>
        {
            "example1",
            "example11",
            "example111"
        }
    },
    new Resource
    {
        RepatedId = 2,
        Name = "whatever",
        Data = new List<string>
        {
            "example2",
            "example11",
            "example222"
        }
    },
    new Resource
    {
        RepatedId = 1,
        Name = "whatever",
        Data = new List<string>
        {
            "example2",
            "example11",
            "example222"
        }
    },
    new Resource
    {
        RepatedId = 1,
        Name = "whatever",
        Data = new List<string>
        {
            "example3",
            "example22",
            "example11"
        }
    },
};

我需要成对的所有组合。所以在第一个元素中,我有“example11”,它也在第三个和第四个(也在第二个,但它没有相同的 RepeatedId),应该是这样的

问题是:

如何遍历集合以查找组合对并返回它们(返回一对资源对象)?

标签: c#algorithmlinq

解决方案


如果您将删除最后一个成员的组与跳过第一个成员的同一组结合起来,并排除成员相同的配对,那么您可以过滤第一个成员Data中存在第二个成员中的元素的配对会员Data

var ans = resource
            .GroupBy(r => r.RepatedId)
            .SelectMany(rg => rg.Take(rg.Count()-1)
                                .SelectMany((r1,n) => rg.Skip(n+1).Select(r2 => new { r1, r2 })))
            .Where(rp => rp.r1.Data.Any(d1 => rp.r2.Data.Contains(d1)))
            .ToList();

推荐阅读