[英]Linq Query Help Needed
假设我有以下LINQ查询:
var source = from workflow in sourceWorkflowList
select new { SubID = workflow.SubID,
ReadTime = workflow.ReadTime,
ProcessID = workflow.ProcessID,
LineID = workflow.LineID };
var target = from workflow in targetWorkflowList
select new { SubID = workflow.SubID,
ReadTime = workflow.ReadTime,
ProcessID = workflow.ProcessID,
LineID = workflow.LineID };
var difference = source.Except(target);
sourceWorkflowList
和targetWorkflowList
具有完全相同的列定义。 但是它们都包含比上面查询中显示的更多的数据列。 这些只是这个特定问题所需的列。
difference
包含sourceWorkflowList
中未包含在targetWorkflowList
中的所有行
现在我想要做的是从sourceWorkflowList
中删除不存在difference
所有行。 有人能告诉我一个可以做到这一点的查询吗?
非常感谢 - 兰迪
你真正想要的是源中的内容而不是(源中有什么而不是目标):S(S \\ T)= S CUT T
var result = from sourceWorkflow in sourceWorkflowList
join targetWorflow in targetWorkflowList on
new {sourceWorkflow.SubID, sourceWorkflow.ReadTime, sourceWorkflow.ProcessID, sourceWorkflow.LineID}
equals
new {targetWorflow.SubID, targetWorflow.ReadTime, targetWorflow.ProcessID, targetWorflow.LineID}
select sourceWorkflow;
并以不同的形式(但这只会给你4列):
var result = sourceWorkflowList.Select(workflow => new {workflow.SubID, workflow.ReadTime, workflow.ProcessID, workflow.LineID})
.Intersect(sourceWorkflowList.Select(workflow => new {workflow.SubID, workflow.ReadTime, workflow.ProcessID, workflow.LineID}));
假设您正在使用List<T>
:
sourceWorkflowList.RemoveAll(
workflow => difference.Contains(
new {
SubID = workflow.SubID,
ReadTime = workflow.ReadTime,
ProcessID = workflow.ProcessID,
LineID = workflow.LineID
}));
抱歉格式化......
如果您有一个约束,要求您只在原始容器中进行更改,请执行@ rob-fonseca-ensor建议的删除,
如果差异列表很大,请考虑将其转换为HashSet()以首先获得快速查找。
除此以外...
如果您可以改变获得差异的方式,请使用@brickner建议的连接/交叉选项,因为这可以防止列表的多次迭代。
如果新集合是可接受的但您已经有差异 (无法替换生成它的代码):
var changedSource = source.Except(difference);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.