gpt4 book ai didi

c# - 使用 Linq 检查孙列表时删除子列表项

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

以下代码显示了我如何将数据分配到 IEnumerable<UnCompletedJobDetailsBO> 中.

有一个列表 ( IEnumerable<UnCompletedJobDetailsBO> ) 有另一个列表 ( List<JobDetailsBO> ),子列表 ( List<JobDetailsBO> ) 上有一个列表。但是 AllocationDetailList只有一个列表项。

public IEnumerable<UnCompletedJobDetailsBO> GetControlDetails(DateTime startDate)
{
var controlDetails =
(from booking in db.BookingDetail
where booking.BookingDateTime >= startDate
orderby booking.DocketNo
select new UnCompletedJobDetailsBO()
{
CustomerName = booking.Customer.Name,
CompanyName = booking.CompanyDetail.Name,
JobList =
(from job in db.BookingJob.Where(x => x.BookingID == booking.BookingID) //get job list
select new JobDetailsBO()
{
JobID = job.JobID,
JobType = job.JobType,
ItemName = job.ItemName,
AllocationDetailList =
(from jobAllocationDetail in db.JobAllocation
join returnUnCollected in db.JobReturnUnCollected
on jobAllocationDetail.JobAllocationDetailID
equals returnUnCollected.JobAllocationDetailID
into returnJob

from returnUnCollected in returnJob.DefaultIfEmpty()
where (jobAllocationDetail.Booking.BookingID == booking.BookingID)
select new AllocationBO()
{
JobUnCollectedID = returnJob.JobUnCollectedID,
JobType = jobAllocationDetail.JobType,
CurrentStatus = jobAllocationDetail.CurrentStatus,
}).DefaultIfEmpty().ToList(),
}).DefaultIfEmpty().ToList(),
}).ToList();

return controlDetails;
}

我想删除 JobList如果内部列表 ( AllocationDetailList) 项目满足以下条件,则为项目。有时AllocationDetailList可能为空,所以我也检查一下。但是当我在下面写查询时,它不会删除那个特定的 JobList满足条件的项目。提前致谢。

public List<UnCompletedJobDetailsBO> RemovePODFromSelectedList(
List<UnCompletedJobDetailsBO> unCompletedJobDetailsBO)
{
unCompletedJobDetailsBO
.SelectMany(y => y.JobList)
.ToList()
.RemoveAll(x => ((x.AllocationDetailList[0] != null) ?
x.AllocationDetailList[0].JobType == "D" &&
x.AllocationDetailList[0].JobUnCollectedID == null &&
x.AllocationDetailList[0].CurrentStatus == 5 :
x.AllocationDetailList.Count > 1));

return unCompletedJobDetailsBO;
}

最佳答案

没有a good, minimal, complete code example ,我不确定是否可以解决任何性能问题。完全理解问题本身已经够难了,但如果无法实际测试代码、重现和观察特定的性能问题,就很难确定您的问题具体出在哪里,更不用说如何解决了。

就是说,从您发布的代码中, 很清楚为什么项目没有从列表中删除。基本问题是虽然 SelectMany()方法确实具有允许您枚举所有不同 JobList 中的所有元素的效果。对象作为单个枚举,元素被枚举为枚举。

当您调用 ToList() 时,您正在从该新枚举创建一个全新的列表,并且当您调用 RemoveAll() 时,您只是从新列表中删除元素,而不是它们最初来自的列表。

你说你可以让它与 for 一起工作环形。我假设你的意思是这样的:

public List<UnCompletedJobDetailsBO> RemovePODFromSelectedList(
List<UnCompletedJobDetailsBO> unCompletedJobDetailsBO)
{
foreach (var item in unCompletedJobDetailsBO)
{
item.JobList.RemoveAll(x => ((x.AllocationDetailList[0] != null) ?
x.AllocationDetailList[0].JobType == "D" &&
x.AllocationDetailList[0].JobUnCollectedID == null &&
x.AllocationDetailList[0].CurrentStatus == 5 :
x.AllocationDetailList.Count > 1));
}

return unCompletedJobDetailsBO;
}

注意:不需要返回unCompletedJobDetailsBO .整个对象没有改变,更不用说变量了。代码唯一修改的是每个人 JobList传入对象成员中的对象。 IE。上面的方法实际上可以有一个返回类型 void , 和 return语句可以完全删除。

可能您可以通过以不同方式删除元素来加快代码速度。 List<T>.RemoveAll()方法实际上相当有效,成本为 O(n)。但它仍然涉及在删除第一个元素之后复制列表中的所有数据(以便所有元素在列表中向下移动)。如果你必须让列表有序,这可能是你能做的最好的,但如果不是,你可以以不同的方式处理删除,或者完全使用不同的数据结构,一些无序的,其中删除一个或多个元素的成本更低。

但同样,如果没有更多细节,也没有一个很好的例子来解决这个特定问题,在这里似乎不切实际。

关于c# - 使用 Linq 检查孙列表时删除子列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29959330/

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