gpt4 book ai didi

c# - 如何比较linq中2个列表中子项的属性

转载 作者:行者123 更新时间:2023-11-30 14:32:43 26 4
gpt4 key购买 nike

我有以下对象:

public interface ITray
{
int OrderNo {get; set;}
IEnumerable<ITrayItem> TrayItems {get;}
}

public interface ITrayItem
{
int Aisle {get; set;}
}

现在,我有两个 List 对象,

List<ITray> selectedTrays
List<ITray> poolTrays

我想要做的是针对 poolTrays 中的每个元素,我想比较所选托盘列表中的过道。如果所有 过道都匹配,我想将其添加到要返回的托盘列表中。我只是有点纠结,试图让 linq 处理列表中集合属性的查询,并返回列表中匹配的项目。

这是我目前拥有的:

List<int> selectedAisles = (from tray in selectedTrays
from item in tray.TrayItems
select item.Aisle).Distinct().ToList()

List<ITray> trayswithMatchingAisles =
(from t in poolTrays
from item in t.TrayItems
where selectedAisles.Contains(item.Aisle)
select t).ToList();

所以,如果我选择了托盘 A、B、C,并且 channel 在括号中A[1,2,3] B[4,5,6] c[7,8,9]

然后在过道 [7,9] 中带有 TrayItems 的 poolTray 应该成功返回,但不应在列表中返回带有 TrayItems [7,8,9,10] 的泳池托盘。

目前,我在我的 poolTray 列表中传入(仅)[7,9],并且在我的 Linq 查询中返回了它的 2 个实例

最佳答案

像这样的东西应该可以工作:

List<int> selectedAisles = 
(from tray in selectedTrays
from item in tray.TrayItems
select item.Aisle)
.Distinct().ToList();

List<ITray> trayswithMatchingAisles =
(from t in poolTrays
where t.TrayItems.Select(i => i.Aisle)
.All(a => selectedAisles.Contains(a))
select t)
.ToList();

但这可以简化为:

List<ITray> trayswithMatchingAisles =
(from t in poolTrays
where t.TrayItems.Select(i => i.Aisle)
.All(a => selectedTrays
.SelectMany(s => s.TrayItems)
.Select(i => i.Aisle)
.Contains(a))
select t)
.ToList();

或者这个:

List<ITray> trayswithMatchingAisles = poolTrays
.Where(t => t.TrayItems
.Select(i => i.Aisle)
.All(a => selectedTrays
.SelectMany(s => s.TrayItems)
.Select(i => i.Aisle)
.Contains(a)))
.ToList();

关于c# - 如何比较linq中2个列表中子项的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18049691/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com