[C#] IntersectBy , ExceptBy 常忘記的兩個好用的 LINQ 方法

2023-02-02

寫一個其實很基本,但是我每次都用蠢方式解決的東西,其實 .NET LINQ 都準備好好地給你用

認識我的人都知道我碰 NOSQL 比較多,所以我常常是在Sever 變成物件後解決一些事情

最近同事說到為何不用 IntersectBy 我才想起來有這東西,就筆記一下我怕自己又忘記有好用的東西



IntersectBy 相交(交集),假設有兩個 物件群A ,B 我可以指定 A物件群 跟某個 property 與 B 物件群的某個 property 有一樣的

撈出 A 物件群有相交的部分

本程式碼範例

篩選出  ListA  的 Id 有 交集到 ListB 的 FriendId


var ListA = new List<Models.User>(); ListA.Add(new Models.User { Id = "A1", Name = "A1", Age = 1 }); ListA.Add(new Models.User { Id = "A2", Name = "A2", Age = 2 }); ListA.Add(new Models.User { Id = "A3", Name = "A3", Age = 3 }); ListA.Add(new Models.User { Id = "A4", Name = "A4", Age = 4 }); ListA.Add(new Models.User { Id = "A5", Name = "A5", Age = 5 }); var ListB = new List<Models.User>(); ListB.Add(new Models.User { Id = "B1", Name = "B1", FriendId = "A1" }); ListB.Add(new Models.User { Id = "B2", Name = "B2", FriendId = "A1" }); ListB.Add(new Models.User { Id = "B3", Name = "B3", FriendId = "A1" }); ListB.Add(new Models.User { Id = "B4", Name = "B4", FriendId = "A4" }); ListB.Add(new Models.User { Id = "B5", Name = "B5", FriendId = "A5" }); //篩選出 ListA 的 Id 有 交集到 ListB 的 FriendId var intersectAFriends = ListA.IntersectBy(ListB.Select(e => e.FriendId), x => x.Id); Result = JsonConvert.SerializeObject(intersectAFriends, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore, }); //Result //[{"Id":"A1","Name":"A1","Age":1},{"Id":"A4","Name":"A4","Age":4},{"Id":"A5","Name":"A5","Age":5}]


ExceptBy 相交除外 ,剛好跟 IntersectBy 相反,就是 假設有兩個 物件群A ,B

我可以指定 A物件群 跟某個 property 都沒有 B 物件群的某個 property 給提到

程式碼案例

篩選出 ListA  的 Id 有 沒有交集到 ListB 的 FriendId

var ListA = new List<Models.User>(); ListA.Add(new Models.User { Id = "A1", Name = "A1", Age = 1 }); ListA.Add(new Models.User { Id = "A2", Name = "A2", Age = 2 }); ListA.Add(new Models.User { Id = "A3", Name = "A3", Age = 3 }); ListA.Add(new Models.User { Id = "A4", Name = "A4", Age = 4 }); ListA.Add(new Models.User { Id = "A5", Name = "A5", Age = 5 }); var ListB = new List<Models.User>(); ListB.Add(new Models.User { Id = "B1", Name = "B1", FriendId = "A1" }); ListB.Add(new Models.User { Id = "B2", Name = "B2", FriendId = "A1" }); ListB.Add(new Models.User { Id = "B3", Name = "B3", FriendId = "A1" }); ListB.Add(new Models.User { Id = "B4", Name = "B4", FriendId = "A4" }); ListB.Add(new Models.User { Id = "B5", Name = "B5", FriendId = "A5" }); //篩選出 ListA 的 Id 有 沒有交集到 ListB 的 FriendId var exceptAFriends = ListA.ExceptBy(ListB.Select(e => e.FriendId), x => x.Id); Result = JsonConvert.SerializeObject(exceptAFriends, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore, }); //Result //[{"Id":"A2","Name":"A2","Age":2},{"Id":"A3","Name":"A3","Age":3}]


筆記一下,雖然簡單但是我真的常常用一些奇技淫巧人家明明就準備得很好


當麻許的碎念筆記 2014 | Donma Hsu Design.