gpt4 book ai didi

c# - 比较 C# 中的两个列表并使用 LINQ 或 foreach 根据条件拒绝或选择子列表

转载 作者:行者123 更新时间:2023-11-30 21:49:36 25 4
gpt4 key购买 nike

我在 C# 中有两个相同实体的列表(一个父列表和另一个可以变化的子列表),它们具有很多属性,其中两个是 V_ID(不是实体的唯一 ID)和值。

我需要比较两个列表,并根据条件从子列表中找出可以完全选择或拒绝的列表:如果 V_ID 在两个列表和值之间相等可以为 null 或等于父列表的值。

我将无法将列表转换为字典,因为如果没有实体的主 ID,我将无法唯一地标识该项目。让我知道是否有办法通过字典来完成。

请帮助我如何实现这一点,我已经尝试了各种方法,包括 LINQ、for-each 等,因为子列表中的所有实体要么被完全拒绝,要么被选中。

我也是 C# 和 Linq 的新手,我提供了从我的原始源代码和各种场景示例中提取的代码示例。

public class MyEntity
{

public int ID {get; set;}

public int W_ID {get; set;}

public long ValueOfW {get; set;}

public string SampleName {get; set;}

public DateTime ModifiedBy {get; set;}

//Other Properties

}
public List<long> MyMethod(List<MyEntity> parentInput, List<MyEntity> childInput)
{
var parentList = new List<MyEntity>(); //Obtained from Source A which is the parent and never changes
var childList = new List<MyEntity>(); //Obtained from Source B and converted to type MyEntity
var mySelectedIds = new List<long>();

if(parentInput.Any() && childInput.Any())
{
parentList = parentInput;
childList = childInput;
foreach(var parent in parentList)
{
foreach(var child in childList)
{
if(parent.W_ID == child.W_ID && (parent.ValueOfW == child.ValueOfW || parent.ValueOfW == 0))
{
mySelectedIds.Add(child.ID);
}
}
}
}
return mySelectedIds; //Need to do some operation after getting the IDs
}

数据样本:

父列表

     W_ID  ValueOfW 
----------
10 100
20 200
30 300

子列表 A:

   W_ID  ValueOfW 
----------
10 100
20 200
30 NULL
Expected Output: The child list A should be selected
as IDs are matching and the value for 30 is NULL

子列表 B

   W_ID  ValueOfW 
----------
10 100
20 200
30 301

Expected Output: The child list B should be selected
as IDs are matching and but the value for 30 is not equal

子列表 C

   W_ID  ValueOfW 
--------
10 100
20 200
30 300
40 400
Expected Output: The child list C should be selected
as IDs are matching and values match even though there is
extra item in the list.

最佳答案

为了简单起见,我要做的第一件事就是让比较成为它自己的函数。这并不重要,但有助于提高可读性。我不知道条件描述的是什么,所以我就称它为TheCondition .(此外,如果条件本身存在错误,则可能更容易通过这种方式发现。)

public bool TheCondition(MyEntity parent, MyEntity child)
{
return parent.W_ID == child.W_ID
&& (parent.ValueOfW == child.ValueOfW || parent.ValueOfW == 0)
}

然后,从子列表中获取你想要的元素

var selected = childList.Where(child => 
parentList.Any(parent => TheCondition(parent, child) == true));

指定 == true只是为了让它更容易阅读。在“现实生活”中,我只会使用

var selected = childList.Where(child => 
parentList.Any(parent => TheCondition(parent, child)));

因为该函数已经返回一个 bool 值。

现在selected是一个 IEnumerable<MyEntity> .要获取 ID 列表,

var ids = selected.Select(entity => entity.ID).ToList();

我们所说的是“从子列表中选择条件为真的子项和父列表中的任何父项”。使用 Any意味着如果它确实找到了与 parent 之一的匹配,则不需要与所有其他 parent 进行比较。

然后在最后一步中,我们说“从先前的实体列表中选择所有 ID”,这会返回 IEnumerable<int>然后创建一个新的 List<int>来自这些值。


如果我们再分解一下,这甚至会更清楚一些。我不一定每次都这样做,但它可以使它更容易理解。 (一开始我对此很纠结——也许你会比我理解得更快。)

public bool TheCondition(MyEntity parent, MyEntity child)
{
return parent.W_ID == child.W_ID
&& (parent.ValueOfW == child.ValueOfW || parent.ValueOfW == 0)
}

public bool ChildMatchesAnyParent(MyEntity child, IEnumerable<MyEntity> parents)
{
return parents.Any(parent => TheCondition(parent, child);
}

var selected = childList.Where(child => ChildMatchesAnyParent(child, parentList));

var ids = selected.Select(entity => entity.ID).ToList();

您也可以将它们链接在一起 list this,将它们组合成一个语句。

var ids = childList.Where(child => ChildMatchesAnyParent(child, parentList))
.Select(entity => entity.ID).ToList();

对我来说,我需要了解它是如何单独工作的,然后开始将它们组合在一起会更容易。但有时为了可读性,将它们分开还是有好处的。

关于c# - 比较 C# 中的两个列表并使用 LINQ 或 foreach 根据条件拒绝或选择子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36813272/

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