C# 查找列表之间的增量<;T>;属性和列表<;T>;
我发现很多关于如何使用except比较两个列表的帖子,但我找不到任何解释如何比较两个列表的属性的文章 我有两种型号C# 查找列表之间的增量<;T>;属性和列表<;T>;,c#,list,C#,List,我发现很多关于如何使用except比较两个列表的帖子,但我找不到任何解释如何比较两个列表的属性的文章 我有两种型号 FruitBasket { ...... public int[] Fruit {get; set;} } Fruit { public int Id {get; set;} ...... } FruitBasket.Fruit属性有一个与Fruit.Id对应的数字数组。然而,果篮中有孤儿,我需要清除掉 例如,FruitBasket.Fruit将包含1,2
FruitBasket
{
......
public int[] Fruit {get; set;}
}
Fruit
{
public int Id {get; set;}
......
}
FruitBasket.Fruit
属性有一个与Fruit.Id
对应的数字数组。然而,果篮中有孤儿,我需要清除掉
例如,FruitBasket.Fruit
将包含1,2,3,4,5,但只有一个水果1、一个水果2、一个水果3。因此,我需要在果篮中找到4和5,并更正果篮
我已经写了一个丑陋的双ForEach
循环通过水果篮
和水果
试图找到三角洲,我得到了惊人的结果,因为我只是不够聪明,无法弄清楚它
List<int> missing = new List<int>();
foreach (var basket in lstBaskets)
{
foreach (var frt in lstFruits)
{
if (!basket.Fruit.Contains(frt.Id))
{
missing.Add(frt.Id);
}
}
}
List missing=新列表();
foreach(风险值篮中的风险值篮)
{
foreach(风险值首次计入当期收益)
{
如果(!basket.Fruit.Contains(frt.Id))
{
缺少。添加(起始Id);
}
}
}
还有一种更优雅的方式来实现这一点吗?当然,这是一种常见的业务需求,并且有一种高效的方式来实现它
注
请注意,其中一个是列表属性(FruitBaskets.Fruit)与仅是列表的水果进行比较。由于您有一个集合集合,因此可以使用SelectMany展平嵌套集合:
List<int> missing = lstBaskets
.SelectMany(s => s.Fruit)
.Select(s => s)
.Except(lstFruits.Select(s => s.Id))
.ToList();
列表缺失=lst
.SelectMany(s=>s.Fruit)
.选择(s=>s)
.Except(lstFruits.Select(s=>s.Id))
.ToList();
是列表
吗?lst
aList
?您可以使用SelectMany展平集合。使用此选项:missing=lstrables.SelectMany(s=>s.Fruit.Select(s=>s.Id)).ToList()
所以您只想查找列表差异?我需要更新OP以澄清和标题。我实际上是在比较列表属性和列表。@GPGVM,我回答了。SelectMany可能会有点混乱。不清楚您要做什么。是否要在basket.Fruit
中标识未知ID值?您显示的代码不会这样做。它标识不在篮子中的水果。因此,如果您有水果{1,2,3},而篮子中包含{1,3,5},那么您显示的循环代码将把2
添加到missing
列表中。第一个SelectMany将其展平,但没有可供选择的ID。果篮中的水果是一个int数组。我改成了这个数组,因为我们可以直接使用,除了我得到零个丢失的记录,这是错误的。List missing=lstAlbums.SelectMany(s=>s.images)。除了(lstmimages.Select(s=>s._id)).ToList();哦,酷s=>s是一种表示它的方式@GPGVM,我犯了一个小错误。如果果篮包含一个水果对象数组而不是整数数组,我最初的答案就行了。我删除了.Id
并更新了我的答案。它现在的工作方式和你期望的一样。我在丢失的集合中得到了零结果,这是不对的。正在检查我的数据。@GPGVM,如果lstrables包含{1,2,3}并且lstFruits包含{3,4,5},是否希望missing包含{1,2}?这就是我根据问题中嵌套的foreach循环给出的答案。您是否希望missing包含{1,2,4,5}?如果是这样,代码将不同。