DistinctBy
是 C# 8.0 中引入的一個新功能,它屬于 System.Linq
命名空間。DistinctBy
方法用于根據指定的屬性或表達式從集合中刪除重復項。默認情況下,它會使用 Object.Equals
方法來比較對象的引用,這意味著它會區分不同的對象實例。
對于多語言數據,如果你想要根據字符串內容(例如,不同的語言中的文本)來刪除重復項,那么 DistinctBy
可以正常工作。但是,你需要確保比較時使用的是正確的文化敏感的比較方法,以避免由于語言特定的排序規則導致的意外結果。
例如,如果你有一個包含不同語言文本的字符串列表,并且你想要根據文本內容刪除重復項,你可以這樣做:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
var texts = new List<string>
{
"apple",
"banana",
"apfel",
"banane"
};
var distinctTexts = texts.DistinctBy(t => t);
foreach (var text in distinctTexts)
{
Console.WriteLine(text);
}
}
}
在這個例子中,DistinctBy
方法會根據字符串的內容(而不是引用)來刪除重復項,因此 “apple” 和 “apfel” 會被視為相同的值,“banana” 和 “banane” 也是如此。
然而,如果你需要處理包含多語言數據的復雜對象,并且想要根據某個屬性(該屬性可能是多語言的)來刪除重復項,那么你可能需要實現自己的比較邏輯,或者使用 StringComparer
類來提供正確的文化敏感的比較。例如:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
var items = new List<Item>
{
new Item { Name = "apple", Language = "en" },
new Item { Name = "banana", Language = "en" },
new Item { Name = "apfel", Language = "de" },
new Item { Name = "banane", Language = "de" }
};
var distinctItems = items.DistinctBy(item => item.Name, StringComparer.OrdinalIgnoreCase);
foreach (var item in distinctItems)
{
Console.WriteLine($"Name: {item.Name}, Language: {item.Language}");
}
}
}
class Item
{
public string Name { get; set; }
public string Language { get; set; }
}
在這個例子中,我們使用了 StringComparer.OrdinalIgnoreCase
來確保名稱的比較是大小寫不敏感的,這樣 “apple” 和 “Apfel” 就會被視為相同的值。