前言

前些天在處理某段處理字串程式的時候發現了一個奇怪的東西。

DB 內有存了一組 AAA 的字串,現在我要比對 AAA+空格。

var number = "AAA ";
	
Summaries.Select(row => row.Number).Contains(number).Dump();

結果

就是那個 True 讓我感到非常驚恐 …

本文

研究了一下發生的原因其實是 Queryable 跟 Enumerable 的實作其實是不一樣的。

StackOverflow 也有相關問題:
What is the difference between an IQueryable’s Contains() and an IEnumerable’s Contains()?

建立一個 List 來做實驗,看看結果。

兩種實作細節可以參考:
Enumerable Contains
Querable Contains

實驗下來 Enumerable 的 Contains 不管空格在前後都能區分得出來不同。

空格在前:

空格在後:

而 Queryable 的 Contains 空格在前區分的出來、空格在後則不行。

空格在前:

空格在後:

Queryable 實作上是往 DB 實際執行的語法靠,所以這邊會牽扯到 DB 的定序問題。
(關於定序問題有興趣的可以參考:定序)
後續使用 Queryable 跟 Enumerable 提供的方法時真的需要小心注意兩邊的實作的細節。