Dot-Net

StringComparison 和 StringComparer 之間轉換的優雅方式?

  • April 30, 2019

一些 .NET 方法使用StringComparison作為參數,一些使用StringComparer(通常以IComparer的形式)。區別很明顯。是否有一些優雅的方法可以從StringComparer獲取****StringComparison ,反之亦然?

我總是可以編寫使用Case語句的簡單方法,但也許 .NET 中已經存在一些我忽略的東西。

StringComparisonStringComparer很簡單 - 只需創建一個Dictionary<StringComparison, StringComparer>

var map = new Dictionary<StringComparison, StringComparer>
{
   { StringComparison.Ordinal, StringComparer.Ordinal },
   // etc
};

StringComparer每個值都有一個StringComparison,所以這種方式很容易工作。請注意,StringComparer.CurrentCulture取決於目前的執行緒文化 - 因此,如果您填充字典然後修改執行緒的文化(或從具有不同文化的不同執行緒進行),您最終可能會得到錯誤的值。你可能想要一個Dictionary<StringComparison, Func<StringComparer>>

var map = new Dictionary<StringComparison, Func<StringComparer>>
{
   { StringComparison.Ordinal, () => StringComparer.Ordinal },
   // etc
};

然後,您可以隨時通過呼叫委託來獲取比較器:

var comparer = map[comparison]();

走另一條路是不可行的,因為不是每個StringComparer 人都有合適的StringComparison. 例如,假設我(在英國)StringComparer為法語創建一個 ( StringComparer.Create(new CultureInfo(..., true))。這StringComparison代表什麼?對於目前的文化、不變的文化或序數比較來說是不正確的。

引用自:https://stackoverflow.com/questions/32763927