c# - 如何检查对象的字符串列表中的项目是否也存在于具有相同标识符的不同对象的其他字符串列表中?
问题描述
我有一个清单
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),应该是这样的
- 第一个资源对象和第三个
- 第一和第四
- 第三和第四
问题是:
如何遍历集合以查找组合对并返回它们(返回一对资源对象)?
解决方案
如果您将删除最后一个成员的组与跳过第一个成员的同一组结合起来,并排除成员相同的配对,那么您可以过滤第一个成员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();
推荐阅读
- postgresql - PostgreSQL 12.3:错误:查询结果内存不足
- elasticsearch - Elasticsearch - 根据尚未索引的新记录中的值更新已索引的多个记录的字段
- mysql - Mysql - 是否可以在非 JSON 列类型上运行 JSON 函数
- powershell - PowerShell Windows Froms:一致的 GUI
- macos - Catalina 中的 SSH 隧道以使用屏幕共享 (VNC)
- javascript - Javascript结合正则表达式模式保留正则表达式结果
- sql - 如何对放置在 2 个不同服务器中的两个不同表进行查询
- r - 循环遍历 R 中的字符串变量名
- python - 加速随机加权选择而不用在 python 中替换
- javascript - 如果 iframe 中的 div 有特定类的孩子