不完全确定这个标题的好标题,随意将其编辑为好的标题
我有一个图像对象,其中包含与其相关的器官列表。
我想查询一个图像列表,找出哪些图像在器官列表中所有器官。
这是方法签名
public static IEnumerable<Image> WithOrgans(this IEnumerable<Image> qry, IEnumerable<Organ> organs)
不太确定如何为此构建linq,会欣赏一些想法,我有一段时间没有做过linq,所以我很生气!
更新
好的,这是一些示例数据
dictionary.Add(7, new Image { id = 7, organs = new List<Organ> { organA, organB }});
dictionary.Add(8, new Image { id = 8, organs = new List<Organ> { organA }});
dictionary.Add(9, new Image { id = 9, organs = new List<Organ> { organC }});
答案 0 :(得分:10)
使用Intersect执行此操作的另一种方法:
from i in qry
where i.Organs.Intersect(organs).Count == organs.Count
select i
ETA:
从你的评论中,你提到你正在获得一个WhereListIterator。我相信WhereListIterator实现了IEnumerable,所以你会得到你应该得到的确切内容。
如果您发现结果不应该是空的,您可能需要检查以确保您的Image类正确实现了Equals()和GetHashCode(),以便可以有效地比较它们。
答案 1 :(得分:1)
假设图像的关联器官存储在Image.Organs集合中,以下查询将完成这一操作。如果由于功能不受支持而需要进行一些修改,则取决于您的LINQ提供程序。
public static IEnumerable<Image> WithOrgans(
this IEnumerable<Image> qry, IEnumerable<Organ> organs)
{
return qry.Where(image => organs.All(organ => image.Organs.Contains(organ)));
}
答案 2 :(得分:0)
也许是这样的?
var imagesWithAllOrgans =
from image in qry
where image.Organs.All(organ => organs.Contains(organ))
select image;
这假设器官是您希望比较图像的所有不同器官的枚举。
答案 3 :(得分:0)
这是一个想法:
为具有每个器官的图像创建一个查询,然后与那些
相交(粗略代码)
var imagesPerOrgan = organs.Select(organ => ImagesOrgans.Where(io => io.OrganId = organ.Id));
var result = null;
foreach (var item in imagesPerOrgan)
{
if (result == null)
{
result = item;
}
else
{
result = result.Intersect(result);
}
}
答案 4 :(得分:0)
只是为了好玩:
IEnumerable<Image> result = qry
.SelectMany(i => i.Organs, (i, o) => new {i, o})
.GroupBy(x => x.o, x => x.i}
.Where(kvp => organs.Contains(kvp.Key))
.Select(kvp => kvp.Value)
.Aggregate( (z, x) => z.Intersect(x) );
带着ha句评论:
//unpack image hi-archy
//group images by organ
//filter to the list
//use the groups' values
//intersect all of those