[英]LINQ: how to get an intersection of two sets of ints?
在使用LINQ時,必須有一種比較兩組結果的方法。 這是我現有的代碼,它使用HashSet在兩個單獨的查詢之后進行比較:
public static void AssertDealershipsShareTransactionGatewayCredentialIds(long DealershipLocationId1,
long DealershipLocationId2)
{
using (var sqlDatabase = new SqlDatabaseConnection())
{
var DealershipCredentials1 =
sqlDatabase.Tables.DealershipLocationTransactionGateway
.Where(x => x.DealershipLocationId == DealershipLocationId1)
.Select(x => x.TransactionGatewayCredentialId);
var DealershipCredentials2 =
sqlDatabase.Tables.DealershipLocationTransactionGateway
.Where(x => x.DealershipLocationId == DealershipLocationId2)
.Select(x => x.TransactionGatewayCredentialId);
var doSetsOfCredentialsMatch = new HashSet<int>(DealershipCredentials1).SetEquals(DealershipCredentials2);
Assert.IsTrue(doSetsOfCredentialsMatch,
"The sets of TransactionGatewayCredentialIds belonging to each Dealership did not match");
}
}
有想法嗎? 謝謝。
簡單的答案(這將進行1個,可能是2個數據庫調用,兩個都只返回一個布爾值):
if (list1.Except(list2).Any() || list2.Except(list1).Any())
{
... They did not match ...
}
更好的答案(這將使1個數據庫調用返回一個布爾值):
var DealershipCredentials1 =
sqlDatabase.Tables.DealershipLocationTransactionGateway
.Where(x => x.DealershipLocationId == DealershipLocationId1)
.Select(x => x.TransactionGatewayCredentialId);
var DealershipCredentials2 =
sqlDatabase.Tables.DealershipLocationTransactionGateway
.Where(x => x.DealershipLocationId == DealershipLocationId2)
.Select(x => x.TransactionGatewayCredentialId);
if (DealershipCredentials1.GroupJoin(DealershipCredential2,a=>a,b=>b,(a,b)=>!b.Any())
.Union(
DealershipCredentials2.GroupJoin(DealershipCredential1,a=>a,b=>b,(a,b)=>!b.Any())
).Any(a=>a))
{
... They did not match ...
}
第二種方法通過合並左外部聯接來工作,該左外部聯接返回一個布爾值,該布爾值指示是否發現有不匹配記錄的右外部聯接執行相同的操作。 我沒有測試過,但是從理論上講,它應該從數據庫中返回一個簡單的布爾值。
另一種方法與第一種方法基本相同,但是包裝在單個LINQ中,因此它將始終僅進行1個數據庫調用:
if (list1.Except(list2).Union(list2.Except(list1)).Any())
{
}
還有另一種方法:
var common=list1.Intersect(list2);
if (list1.Except(common).Union(list2.Except(common)).Any()) {}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.