[英]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.