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



我有一个列表

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

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

我按RepatedId 对资源进行分组

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

但我不知道如何从第一个资源中的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"
}
},
};

我需要各种组合的鞋。所以在第一个元素中;示例11";它也在第三个和第四个(也在第二个,但它没有相同的RepeatedId(,应该像这个

  • 第一个资源对象和第三个
  • 第一和第四
  • 第三和第四

问题是:

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

如果将删除最后一个成员的组与跳过第一个成员的同一组组合,并排除成员相同的配对,则可以筛选第一个成员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();

最新更新