说我有以下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
中不存在的{{1}}行。有人可以给我一个查询吗?
非常感谢 - 兰迪
答案 0 :(得分:2)
你真正想要的是源中的内容而不是(源中的内容而不是目标中的内容):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}));
答案 1 :(得分:1)
假设您使用的是List<T>
:
sourceWorkflowList.RemoveAll(
workflow => difference.Contains(
new {
SubID = workflow.SubID,
ReadTime = workflow.ReadTime,
ProcessID = workflow.ProcessID,
LineID = workflow.LineID
}));
格式化道歉...
答案 2 :(得分:1)
如果你有一个约束要求你只在原始容器中进行更改,请执行@ rob-fonseca-ensor建议的删除,
如果差异列表很大,请考虑将其转换为HashSet()以首先获得快速查找。
...否则
如果您可以更改差异的方式,请使用@brickner建议的连接/交叉选项,因为这样可以防止列表的多次迭代。
如果新集合可以接受,但您已经有差异(无法替换生成它的代码):
var changedSource = source.Except(difference);