我最近開始學習Linq。我遇到了一些內置方法,例如 Min() 和 Max()。這兩種方法的作業與 int[] 很好。但是當談到 string[] 時,我很好奇它是如何作業的。我嘗試了一些代碼
string[] cars = { "Volvo", "BMW", "Ford", "Mazda" };
Console.WriteLine(cars.Max());
Console.WriteLine(cars.Min());
輸出是這樣的:
**沃爾沃 Max()
BMW for Min()**
你能解釋一下它是如何作業的,它是按字母順序排列的第一個字母,還是它使用了任何基于 ASCII 值等的機制?
uj5u.com熱心網友回復:
可以使用每種型別實作的CompareTo方法來比較實作IComparable或IComparable介面的所有型別。所有原始型別都實作了,包括和。LINQ并使用此實作來查找可列舉中的最小值或最大值。IComparable<T>charstringMin(IEnumerable)Max(IEnumerable)
字串比較
比較字串雖然比比較整數更有趣。字串通常按字典順序(按字典順序)進行比較,但是......誰的字典?不同的語言有不同的排序規則,有時兩個字母被認為是一個字母。甚至丹麥人也忘記了這AA相當于?丹麥語。
用于比較字串的字典由CultureInfo類提供。默認情況下,使用當前執行緒的文化,它通常與最終用戶的文化(在桌面應用程式中)或服務器應用程式中的系統區域設定相匹配。例如,在丹麥文化中,AA它的處理方式與aa- 我認為其中一個是在相同大小寫的其他字母之后排序的,而另一個不是,但不要問我是哪個。
InvariantCulture指定了敏感文化中的區域設定,可用于在每個區域設定中以相同的方式處理字串。它使用大多數合理.的設定(例如小數點),除了日期,它使用美國格式而不是每個人都期望的 ISO8601 (YYYY-MM-DD) 格式。
自定義比較
IComparer可以通過將實作的類傳遞給受順序影響的任何 LINQ 方法 來指定不同的比較方法。Min(IEnumerable,IComparer)就是一個例子。
StringComparer類包含一些預定義的比較器:
- CurrentCulture是默認設定
- CurrentCultureIgnoreCase使用當前區域性但忽略大小寫,因此
A等于a。這非常有用,例如在字典中。 - InvariantCulture并
InvariantCultureIgnoreCase使用 Invariantculture 進行排序 - 最后,Ordinal不
OrdinalIgnoreCase使用字典,而是比較字符的 Unicode 值。如果您不關心語言環境規則,這是最快的選擇
uj5u.com熱心網友回復:
對于字串串列 Min() 和 Max() 分別跟隨第一個和最后一個單詞或字母,但對于整數 Min() 和 Max() 遵循從串列中找到最小和最大數字的確切現象。 在此處輸入影像描述
uj5u.com熱心網友回復:
字串按字母順序進行比較,轉換為以下邏輯:
- 哪個專案的第一個字符更高
- 哪個專案具有更高的第二個字符
- 哪個專案的第三個字符更高
- ...
在第一個不同的字符處檢測到差異。因此,當您與 比較string1時string2,則string1大于string2如果在它們的第一個不同字符(從左到右)string1處具有比 更大的值string2。如果string2是string1 ,則和string3之間的第一個差值超出和 在該點的比較結果大于。string1string2string1string2string1
如果您對此比較不滿意,那么您可以指定您打算使用的比較器,請參見此處:https ://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.max?view= net-6.0#system-linq-enumerable-max-1(system-collections-generic-ienumerable((-0))-system-collections-generic-icomparer((-0)))
基本上在這種情況下,您需要實作一個IComparer并將其作為第二個引數傳遞,例如
cars.Max(c => c, yourcomparer)
uj5u.com熱心網友回復:
.Max()使用Compare(String, String)
它比較兩個指定的 String 物件并回傳一個整數,指示它們在排序順序中的相對位置。
.Max()字串比較的源代碼
public static TSource Max<TSource>(this IEnumerable<TSource> source) {
if (source == null) throw Error.ArgumentNull("source");
Comparer<TSource> comparer = Comparer<TSource>.Default;
TSource value = default(TSource);
if (value == null) {
foreach (TSource x in source) {
if (x != null && (value == null || comparer.Compare(x, value) > 0))
value = x;
}
return value;
}
else {
bool hasValue = false;
foreach (TSource x in source) {
if (hasValue) {
if (comparer.Compare(x, value) > 0) //Compare strings
value = x;
}
else {
value = x;
hasValue = true;
}
}
if (hasValue) return value;
throw Error.NoElements();
}
}
比較(字串,字串) https://docs.microsoft.com/en-us/dotnet/api/system.string.compare?view=net-6.0#system-string-compare(system-string-system-string)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/463216.html
上一篇:在C#中將List<string>轉換為List<object>
下一篇:SQL到LinqLambda
